10407 2024. 04. 01 21:01:44 111 Az ékszerész játéka cpp17 Elfogadva 100/100 649ms 203416 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 Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 2272 KiB
2 Elfogadva 3ms 2880 KiB
subtask2 15/15
3 Elfogadva 3ms 2772 KiB
4 Elfogadva 3ms 2860 KiB
5 Elfogadva 3ms 3080 KiB
6 Elfogadva 3ms 3336 KiB
subtask3 45/45
7 Elfogadva 3ms 3968 KiB
8 Elfogadva 3ms 4772 KiB
9 Elfogadva 4ms 7412 KiB
10 Elfogadva 7ms 10064 KiB
11 Elfogadva 7ms 9980 KiB
subtask4 40/40
12 Elfogadva 27ms 26024 KiB
13 Elfogadva 129ms 88088 KiB
14 Elfogadva 541ms 194092 KiB
15 Elfogadva 500ms 197776 KiB
16 Elfogadva 462ms 199936 KiB
17 Elfogadva 441ms 201452 KiB
18 Elfogadva 425ms 202696 KiB
19 Elfogadva 414ms 203416 KiB
20 Elfogadva 642ms 192796 KiB
21 Elfogadva 649ms 193068 KiB
22 Elfogadva 648ms 193468 KiB
23 Elfogadva 555ms 194260 KiB
24 Elfogadva 620ms 193604 KiB