103952024-04-01 19:01:23111Az ékszerész játékacpp17Wrong answer 15/100642ms203668 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]){
							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];
							}
						}
						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
1Accepted3ms2068 KiB
2Accepted3ms2424 KiB
subtask215/15
3Accepted3ms2320 KiB
4Accepted3ms2536 KiB
5Accepted3ms2920 KiB
6Accepted3ms3032 KiB
subtask30/45
7Accepted3ms3716 KiB
8Wrong answer4ms4796 KiB
9Wrong answer4ms7428 KiB
10Wrong answer7ms10100 KiB
11Accepted7ms10032 KiB
subtask40/40
12Wrong answer27ms25820 KiB
13Wrong answer129ms87888 KiB
14Wrong answer544ms193812 KiB
15Wrong answer537ms197568 KiB
16Wrong answer495ms200108 KiB
17Wrong answer474ms201760 KiB
18Wrong answer432ms203000 KiB
19Wrong answer446ms203668 KiB
20Accepted628ms192916 KiB
21Wrong answer558ms193316 KiB
22Wrong answer555ms193572 KiB
23Wrong answer642ms194636 KiB
24Wrong answer615ms194140 KiB