103982024-04-01 19:21:21111Az ékszerész játékacpp17Hibás válasz 15/100634ms202848 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]){
							int cc=s[r[t[z]]]-1;
							if(!des(y1,z)&&w[y1]==y1){
								cc-=s[y1]-1;
								if(b++){
									cc=0;
								}
							}
							else{
								int k=1;
								for(int kk:g[y1]){
									if(x[kk]!=x[y1]){
										continue;
									}
									if(des(y1,kk)&&des(kk,z)){
										if(k!=-1&&s[k]>s[kk]){
											continue;
										}
										k=kk;
									}
								}
								if(k==-1){
									exit(1);
								}
								if(v[w[k]]>=v[y1]){
									if(bb.insert(k).second){
										cc=s[k];
									}
									else{
										cc=0;
									}
								}
							}
							// 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];
							// }
							c[i]+=cc;
							// if(s[r[t[z]]]-1==cc)c[i]=-110;
						}
						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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1940 KiB
2Elfogadva3ms2268 KiB
subtask215/15
3Elfogadva3ms2284 KiB
4Elfogadva3ms2364 KiB
5Elfogadva3ms2620 KiB
6Elfogadva3ms2712 KiB
subtask30/45
7Elfogadva3ms3352 KiB
8Elfogadva3ms4400 KiB
9Hibás válasz4ms7012 KiB
10Hibás válasz7ms9548 KiB
11Elfogadva6ms9724 KiB
subtask40/40
12Hibás válasz27ms25664 KiB
13Hibás válasz129ms87528 KiB
14Hibás válasz554ms193648 KiB
15Hibás válasz540ms197484 KiB
16Hibás válasz467ms199640 KiB
17Hibás válasz442ms201244 KiB
18Hibás válasz426ms202104 KiB
19Hibás válasz416ms202848 KiB
20Elfogadva545ms192296 KiB
21Hibás válasz547ms192276 KiB
22Hibás válasz550ms192332 KiB
23Hibás válasz634ms193580 KiB
24Hibás válasz550ms192724 KiB