104052024-04-01 20:55:09111Az ékszerész játékacpp17Hibás válasz 60/100616ms203964 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){
							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]){
											b=2;
										}
										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){
							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
1Elfogadva3ms2136 KiB
2Elfogadva3ms2484 KiB
subtask215/15
3Elfogadva3ms2868 KiB
4Elfogadva3ms2876 KiB
5Elfogadva3ms2900 KiB
6Elfogadva3ms3028 KiB
subtask345/45
7Elfogadva3ms3664 KiB
8Elfogadva3ms4552 KiB
9Elfogadva4ms7372 KiB
10Elfogadva7ms10152 KiB
11Elfogadva7ms10368 KiB
subtask40/40
12Hibás válasz28ms25948 KiB
13Hibás válasz127ms88360 KiB
14Hibás válasz529ms194580 KiB
15Hibás válasz537ms198292 KiB
16Hibás válasz449ms200480 KiB
17Elfogadva428ms202156 KiB
18Elfogadva444ms203024 KiB
19Elfogadva405ms203964 KiB
20Elfogadva549ms193280 KiB
21Elfogadva616ms193548 KiB
22Hibás válasz546ms193680 KiB
23Hibás válasz545ms194680 KiB
24Hibás válasz595ms194032 KiB