103912024-04-01 18:48:17111Az ékszerész játékacpp17Hibás válasz 15/100546ms202700 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

#define NM 1002

int N,x[NM*NM],g[NM*NM][4],s[NM*NM],v[NM*NM],w[NM*NM],p[NM*NM],t[NM*NM],r[NM*NM],ti[NM*NM],to[NM*NM],ta;

void dfs(int i){
	s[i]=1;
	w[i]=i;
	ti[i]=ta++;
	for(int j:g[i]){
		if(x[j]!=x[i]){
			continue;
		}
		if(j==p[i]){
			continue;
		}
		if(v[j]){
			if(v[j]<v[w[i]]){
				w[i]=j;
			}
			continue;
		}
		v[j]=v[i]+1;
		p[j]=i;
		t[j]=t[i];
		dfs(j);
		s[i]+=s[j];
		if(v[w[j]]<v[w[i]]){
			w[i]=w[j];
		}
	}
	to[i]=ta++;
}

int des(int i,int j){
	return ti[i]<=ti[j]&&to[i]>=to[j];
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int N;
	cin>>N;
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			cin>>x[i*NM+j];
		}
	}
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			g[i*NM+j][0]=i*NM+j-1;
			g[i*NM+j][1]=i*NM+j+1;
			g[i*NM+j][2]=(i-1)*NM+j;
			g[i*NM+j][3]=(i+1)*NM+j;
		}
	}
	int o=0;
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			int y=i*NM+j;
			if(v[y]){
				continue;
			}
			o++;
			v[y]=1;
			t[y]=o;
			r[o]=y;
			dfs(y);
		}
	}
	for(int d=0;d<2;d++){
		for(int i=1;i+(d==1)<=N;i++){
			for(int j=1;j+(d==0)<=N;j++){
				int y1=i*NM+j;
				int y2=(i+(d==1))*NM+j+(d==0);
				if(t[y1]==t[y2]){
					cout<<0<<' ';
					continue;
				}
				int c[2]{1,1};
				for(int i=0;i<2;i++){
					int b=0;
					set<int>bb;
					for(int z:g[y2]){
						if(z==y1){
							continue;
						}
						if(x[z]!=x[y1]){
							continue;
						}
						if(t[z]==t[y1]&&w[y1]==y1){
							if(!des(y1,z)){
								if(!b){
									b=1;
									c[i]+=s[r[t[z]]]-s[y1];
								}
								continue;
							}
							int k=-1;
							for(int kk:g[y1]){
								if(des(y1,kk)&&des(kk,z)){
									if(k!=-1){
										cout<<(y1/NM)<<' '<<(y1%NM)<<endl;
										cout<<(y2/NM)<<' '<<(y2%NM)<<endl;
										cout<<(z/NM)<<' '<<(z%NM)<<endl;
										cout<<"old "<<(k/NM)<<' '<<(k%NM)<<endl;
										cout<<"new "<<(kk/NM)<<' '<<(kk%NM)<<endl;
										exit(1);
									}
									k=kk;
								}
							}
							if(k==-1){
								exit(1);
							}
							if(bb.insert(k).second){
								c[i]+=s[k];
							}
						}
						else{
							c[i]+=s[r[t[z]]];
							for(int zz:g[y2]){
								if(zz<z&&z!=y1&&t[zz]==t[z]){
									c[i]-=s[r[t[z]]];
									break;
								}
							}
						}
					}
					swap(y1,y2);
				}
				cout<<c[0]*c[1]<<' ';
			}
			cout<<'\n';
		}
	}
	return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms2072 KiB
2Elfogadva3ms2432 KiB
subtask215/15
3Elfogadva3ms2456 KiB
4Elfogadva3ms2656 KiB
5Elfogadva3ms2740 KiB
6Elfogadva3ms2848 KiB
subtask30/45
7Elfogadva3ms3392 KiB
8Hibás válasz3ms4164 KiB
9Futási hiba4ms6744 KiB
10Futási hiba4ms9252 KiB
11Elfogadva6ms9476 KiB
subtask40/40
12Futási hiba14ms25368 KiB
13Futási hiba57ms87612 KiB
14Futási hiba212ms193536 KiB
15Futási hiba186ms197184 KiB
16Futási hiba173ms199760 KiB
17Futási hiba166ms201088 KiB
18Futási hiba164ms202088 KiB
19Futási hiba159ms202700 KiB
20Elfogadva542ms192068 KiB
21Hibás válasz545ms192068 KiB
22Hibás válasz546ms192176 KiB
23Futási hiba337ms193288 KiB
24Futási hiba246ms192300 KiB