104072024-04-01 21:01:44111Az ékszerész játékacpp17Elfogadva 100/100649ms203416 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;
					for(int z:g[y2]){
						if(z==y1){
							continue;
						}
						if(x[z]!=x[y1]){
							continue;
						}
						if(t[z]==t[y1]){
							if(des(y1,z)){
								b|=1;
							}
							else{
								b|=2;
							}
							continue;
						}
						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;
							}
						}
					}
					if(b){
						if(b==1){
							int cc=c[i];
							for(int k:g[y1]){
								if(x[k]!=x[y1]){
									continue;
								}
								if(v[k]!=v[y1]+1){
									continue;
								}
								for(int kk:g[y2]){
									if(kk==y1){
										continue;
									}
									if(t[kk]!=t[y1]){
										continue;
									}
									if(des(k,kk)){
										if(v[w[k]]<v[y1]){
											c[i]=cc;
											goto l3;
										}
										c[i]+=s[k];
										break;
									}
								}
							}
							if(b==2){
								c[i]+=s[r[t[y1]]]-s[y1];
								b=1;
							}
						}
						if(b==2){
							for(int k:g[y1]){
								if(x[k]!=x[y1]){
									continue;
								}
								if(v[k]!=v[y1]+1){
									continue;
								}
								if(v[w[k]]<v[y1]){
									c[i]+=s[k];
								}
							}
							c[i]+=s[r[t[y1]]]-s[y1];
						}
						if(b==3){
						l3:
							c[i]+=s[r[t[y1]]]-1;
							for(int k:g[y1]){
								if(x[k]!=x[y1]){
									continue;
								}
								if(v[k]!=v[y1]+1){
									continue;
								}
								if(w[k]!=k){
									continue;
								}
								c[i]-=s[k];
								for(int kk:g[y2]){
									if(kk==y1){
										continue;
									}
									if(t[kk]!=t[y1]){
										continue;
									}
									if(des(k,kk)){
										c[i]+=s[k];
										break;
									}
								}
							}
						}
					}
					swap(y1,y2);
				}
				cout<<c[0]*c[1]<<' ';
			}
			cout<<'\n';
		}
	}
	return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms2272 KiB
2Elfogadva3ms2880 KiB
subtask215/15
3Elfogadva3ms2772 KiB
4Elfogadva3ms2860 KiB
5Elfogadva3ms3080 KiB
6Elfogadva3ms3336 KiB
subtask345/45
7Elfogadva3ms3968 KiB
8Elfogadva3ms4772 KiB
9Elfogadva4ms7412 KiB
10Elfogadva7ms10064 KiB
11Elfogadva7ms9980 KiB
subtask440/40
12Elfogadva27ms26024 KiB
13Elfogadva129ms88088 KiB
14Elfogadva541ms194092 KiB
15Elfogadva500ms197776 KiB
16Elfogadva462ms199936 KiB
17Elfogadva441ms201452 KiB
18Elfogadva425ms202696 KiB
19Elfogadva414ms203416 KiB
20Elfogadva642ms192796 KiB
21Elfogadva649ms193068 KiB
22Elfogadva648ms193468 KiB
23Elfogadva555ms194260 KiB
24Elfogadva620ms193604 KiB