103912024-04-01 18:48:17111Az ékszerész játékacpp17Wrong answer 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;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted3ms2072 KiB
2Accepted3ms2432 KiB
subtask215/15
3Accepted3ms2456 KiB
4Accepted3ms2656 KiB
5Accepted3ms2740 KiB
6Accepted3ms2848 KiB
subtask30/45
7Accepted3ms3392 KiB
8Wrong answer3ms4164 KiB
9Runtime error4ms6744 KiB
10Runtime error4ms9252 KiB
11Accepted6ms9476 KiB
subtask40/40
12Runtime error14ms25368 KiB
13Runtime error57ms87612 KiB
14Runtime error212ms193536 KiB
15Runtime error186ms197184 KiB
16Runtime error173ms199760 KiB
17Runtime error166ms201088 KiB
18Runtime error164ms202088 KiB
19Runtime error159ms202700 KiB
20Accepted542ms192068 KiB
21Wrong answer545ms192068 KiB
22Wrong answer546ms192176 KiB
23Runtime error337ms193288 KiB
24Runtime error246ms192300 KiB