103982024-04-01 19:21:21111Az ékszerész játékacpp17Wrong answer 15/100634ms202848 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=10;
	cin>>N;
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			x[i*NM+j]=rand()%4+1;
			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]){
							int cc=s[r[t[z]]]-1;
							if(!des(y1,z)&&w[y1]==y1){
								cc-=s[y1]-1;
								if(b++){
									cc=0;
								}
							}
							else{
								int k=1;
								for(int kk:g[y1]){
									if(x[kk]!=x[y1]){
										continue;
									}
									if(des(y1,kk)&&des(kk,z)){
										if(k!=-1&&s[k]>s[kk]){
											continue;
										}
										k=kk;
									}
								}
								if(k==-1){
									exit(1);
								}
								if(v[w[k]]>=v[y1]){
									if(bb.insert(k).second){
										cc=s[k];
									}
									else{
										cc=0;
									}
								}
							}
							// 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&&s[k]>s[kk]){
										// cout.flush();
										// system("cls");
										// for(int i=1;i<=N;i++){
											// for(int j=1;j<=N;j++){
												// cout<<x[i*NM+j]<<' ';
											// }
											// cout<<'\n';
										// }
										// 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);
										// continue;
									// }
									// k=kk;
								// }
							// }
							// if(k==-1){
								// exit(1);
							// }
							// if(bb.insert(k).second){
								// c[i]+=s[k];
							// }
							c[i]+=cc;
							// if(s[r[t[z]]]-1==cc)c[i]=-110;
						}
						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);
				}
				// c[1]=1;
				cout<<c[0]*c[1]<<' ';
			}
			cout<<'\n';
		}
	}
	if(0){
		memset(x,0,sizeof(x));
		memset(g,0,sizeof(g));
		memset(s,0,sizeof(s));
		memset(v,0,sizeof(v));
		memset(w,0,sizeof(w));
		memset(p,0,sizeof(p));
		memset(t,0,sizeof(t));
		memset(r,0,sizeof(r));
		memset(ti,0,sizeof(ti));
		memset(to,0,sizeof(to));
		ta=0;
		main();
	}
	return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted3ms1940 KiB
2Accepted3ms2268 KiB
subtask215/15
3Accepted3ms2284 KiB
4Accepted3ms2364 KiB
5Accepted3ms2620 KiB
6Accepted3ms2712 KiB
subtask30/45
7Accepted3ms3352 KiB
8Accepted3ms4400 KiB
9Wrong answer4ms7012 KiB
10Wrong answer7ms9548 KiB
11Accepted6ms9724 KiB
subtask40/40
12Wrong answer27ms25664 KiB
13Wrong answer129ms87528 KiB
14Wrong answer554ms193648 KiB
15Wrong answer540ms197484 KiB
16Wrong answer467ms199640 KiB
17Wrong answer442ms201244 KiB
18Wrong answer426ms202104 KiB
19Wrong answer416ms202848 KiB
20Accepted545ms192296 KiB
21Wrong answer547ms192276 KiB
22Wrong answer550ms192332 KiB
23Wrong answer634ms193580 KiB
24Wrong answer550ms192724 KiB