103892024-04-01 18:35:51111Az ékszerész játékacpp17Hibás válasz 15/100612ms203256 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++){
					for(int z:g[y2]){
						if(z==y1){
							continue;
						}
						if(x[z]!=x[y1]){
							continue;
						}
						if(t[z]==t[y1]&&w[y1]==y1){
							int k=-1;
							for(int kk:g[y1]){
								if(des(kk,z)){
									k=kk;
								}
							}
							c[i]+=k==-1?s[r[t[z]]]-s[y1]: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);
				}
				cout<<c[0]*c[1]<<' ';
			}
			cout<<'\n';
		}
	}
	return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms2140 KiB
2Elfogadva3ms2492 KiB
subtask215/15
3Elfogadva3ms2792 KiB
4Elfogadva3ms2724 KiB
5Elfogadva3ms2968 KiB
6Elfogadva3ms3060 KiB
subtask30/45
7Hibás válasz3ms3764 KiB
8Hibás válasz3ms4444 KiB
9Hibás válasz4ms7040 KiB
10Hibás válasz6ms9792 KiB
11Hibás válasz6ms9828 KiB
subtask40/40
12Hibás válasz25ms25504 KiB
13Hibás válasz120ms87780 KiB
14Hibás válasz500ms193636 KiB
15Hibás válasz462ms197344 KiB
16Hibás válasz433ms199712 KiB
17Hibás válasz411ms201032 KiB
18Hibás válasz426ms202360 KiB
19Hibás válasz416ms203256 KiB
20Hibás válasz612ms192876 KiB
21Hibás válasz540ms193004 KiB
22Hibás válasz544ms192884 KiB
23Hibás válasz513ms194008 KiB
24Hibás válasz513ms193384 KiB