103952024-04-01 19:01:23111Az ékszerész játékacpp17Hibás válasz 15/100642ms203668 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]){
							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];
							}
						}
						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
1Elfogadva3ms2068 KiB
2Elfogadva3ms2424 KiB
subtask215/15
3Elfogadva3ms2320 KiB
4Elfogadva3ms2536 KiB
5Elfogadva3ms2920 KiB
6Elfogadva3ms3032 KiB
subtask30/45
7Elfogadva3ms3716 KiB
8Hibás válasz4ms4796 KiB
9Hibás válasz4ms7428 KiB
10Hibás válasz7ms10100 KiB
11Elfogadva7ms10032 KiB
subtask40/40
12Hibás válasz27ms25820 KiB
13Hibás válasz129ms87888 KiB
14Hibás válasz544ms193812 KiB
15Hibás válasz537ms197568 KiB
16Hibás válasz495ms200108 KiB
17Hibás válasz474ms201760 KiB
18Hibás válasz432ms203000 KiB
19Hibás válasz446ms203668 KiB
20Elfogadva628ms192916 KiB
21Hibás válasz558ms193316 KiB
22Hibás válasz555ms193572 KiB
23Hibás válasz642ms194636 KiB
24Hibás válasz615ms194140 KiB