QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#94785#6167. 染色图的联通性问题youngsystem80 1421ms138148kbC++143.8kb2023-04-07 19:05:472023-04-07 19:05:48

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-04-07 19:05:48]
  • 评测
  • 测评结果:80
  • 用时:1421ms
  • 内存:138148kb
  • [2023-04-07 19:05:47]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int n=0,f=1,ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		n=n*10+ch-'0';
		ch=getchar();
	}
	return n*f;
}
int c[1000005];
int zsl[1000005];
vector<int>v[1000005];
int tmp;
int sta[1000005],ttop;
int dfn[1000005],low[1000005],cnt;
void tarjan(int x,int f)
{
	dfn[x]=++cnt;
	low[x]=dfn[x];
	sta[++ttop]=x;
	bool flag=false;
	for(int i=0;i<v[x].size();i++)
	{
		if(v[x][i]==f)continue;
		if(dfn[v[x][i]]==0)
		{
			flag=true;
			tarjan(v[x][i],x);
			low[x]=min(low[x],low[v[x][i]]);
			if(low[v[x][i]]>=dfn[x])
			{
				++tmp;
				while(1)
				{
					v[tmp].push_back(sta[ttop]);
					if(sta[ttop]==v[x][i])
					{
						ttop--;
						break;
					}
					ttop--;
				}
				v[tmp].push_back(x);
			}
		}
		else low[x]=min(low[x],dfn[v[x][i]]);
	}
}
int zs[1000005],zsw[1000005];
int siz[1000005],son[1000005],fa[1000005];
void dfs1(int x,int f)
{
	//printf("%d %d\n",x,f);
	siz[x]=1;
	fa[x]=f;
	int maxn=-1;
	for(int i=0;i<v[x].size();i++)
	{
		if(v[x][i]==f)continue;
		dfs1(v[x][i],x);
		siz[x]+=siz[v[x][i]];
		if(siz[v[x][i]]>maxn)
		{
			maxn=siz[v[x][i]];
			son[x]=v[x][i];
		}
	}
}
int nsl[1000005],ans,n;
void change(int x,int f,int opt)
{
	if(x<=n)
	{
		//printf("???%d %d %d\n",x,c[x],nsl[c[x]]);
		if(opt==1)
		{
			ans+=nsl[c[x]];
			nsl[c[x]]++;
		}
		else if(opt==2)
		{
			nsl[c[x]]--;
			ans-=nsl[c[x]];
		}
	}
	for(int i=0;i<v[x].size();i++)
	{
		if(v[x][i]==f)continue;
		change(v[x][i],x,opt);
	}
}
bool vis[1000005];
void dfszs(int x,int f)
{
	//printf("%d %d\n",x,f);
	vis[x]=true;
	for(int i=0;i<v[x].size();i++)
	{
		if(v[x][i]==f||v[x][i]==son[x])continue;
		dfszs(v[x][i],x);
		change(v[x][i],x,2);
	}
	if(son[x]!=0)dfszs(son[x],x);
	for(int i=0;i<v[x].size();i++)
	{
		if(v[x][i]==f||v[x][i]==son[x])continue;
		change(v[x][i],x,1);
	}
	if(x<=n)
	{
		ans+=nsl[c[x]];
		nsl[c[x]]++;
	}
	zs[x]=ans;
}
void dfszsw(int x,int f)
{
	vis[x]=true;
	for(int i=0;i<v[x].size();i++)
	{
		if(v[x][i]==f||v[x][i]==son[x])continue;
		dfszsw(v[x][i],x);
		change(v[x][i],x,1);
	}
	if(son[x]!=0)dfszsw(son[x],x);
	for(int i=0;i<v[x].size();i++)
	{
		if(v[x][i]==f||v[x][i]==son[x])continue;
		change(v[x][i],x,2);
	}
	if(x<=n)
	{
		nsl[c[x]]--;
		ans-=nsl[c[x]];
	}
	zsw[x]=ans;
}
int ff[1000005],zda[1000005];
int findf(int n)
{
	if(ff[n]==n)return n;
	return ff[n]=findf(ff[n]);
}
signed main()
{
	int m,x,y;
	n=read();
	m=read();
	for(int i=1;i<=n;i++)
	{
		c[i]=read();
		zsl[c[i]]++;
	}
	int zans=0;
	for(int i=1;i<=n;i++)
	{
		zans+=1LL*zsl[i]*(zsl[i]-1)/2;
	}
	while(cin>>x>>y)
	{
		v[x].push_back(y);
		v[y].push_back(x);
	}
	tmp=n;
	for(int i=1;i<=n;i++)if(dfn[i]==0)tarjan(i,0);
	for(int i=1;i<=n;i++)v[i].clear();
	for(int i=n+1;i<=tmp;i++)
	{
		for(int j=0;j<v[i].size();j++)
		{
			v[v[i][j]].push_back(i);
		}
	}
	for(int i=1;i<=tmp;i++)ff[i]=i;
	for(int i=1;i<=tmp;i++)
	{
		for(int j=0;j<v[i].size();j++)
		{
			//printf("%d %d\n",i,v[i][j]);
			int tx=findf(i),ty=findf(v[i][j]);
			if(tx==ty)continue;
			ff[tx]=ty;
		}
	}
	for(int i=1;i<=tmp;i++)
	{
		if(ff[i]!=i)continue;
		dfs1(i,0);
	}
	//printf("orz1\n");
	int het=0;
	for(int i=1;i<=tmp;i++)
	{
		if(ff[i]!=i)continue;
		dfszs(i,0);
		het+=ans;
		zda[i]=ans;
		change(i,0,2);
	}
	//printf("orz2\n");
	for(int i=1;i<=tmp;i++)
	{
		if(ff[i]!=i)continue;
		change(i,0,1);
		dfszsw(i,0);
	}
	//for(int i=1;i<=tmp;i++)printf("%lld %lld\n",zs[i],zsw[i]);
	for(int i=1;i<=n;i++)
	{
		int qans=het-zda[findf(i)];
		for(int j=0;j<v[i].size();j++)
		{
			if(v[i][j]==fa[i])continue;
			qans+=zs[v[i][j]];
		}
		qans+=zsw[i];
		printf("%lld\n",zans-qans);
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 10
Accepted
time: 4ms
memory: 44452kb

input:

114 4191
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
59 46
6 103
2 80
5 80
1 34
1 15
8 34
4 100
30 104
8 44
8 76
21 ...

output:

3321
2839
2922
3661
2839
3393
2922
3004
2755
2755
2670
3234
2839
3082
2839
2755
2922
2755
2755
2755
2839
2755
2755
2839
2839
2755
2839
2673
2755
3003
2755
2670
2670
2755
2755
2755
2755
2755
2670
2755
2755
2755
2755
2755
2755
2755
2755
2670
2755
2670
2755
2755
2670
2670
2670
2670
2670
2755
2839
2839
...

result:

ok 114 numbers

Test #2:

score: 10
Accepted
time: 3ms
memory: 44624kb

input:

1000 138966
110 156 136 6 16 313 383 173 95 189 119 143 202 152 18 277 83 6 196 516 65 131 5 6 70 30 97 192 581 12 1 46 58 136 638 62 9 283 15 63 9 37 199 35 7 154 111 17 230 341 150 261 191 2 104 14 138 265 1 18 105 47 25 2 49 210 435 91 372 375 42 5 61 136 1 89 217 205 37 97 96 310 2 114 292 132 6...

output:

1307
1306
1310
1319
1313
1306
1306
1307
1308
1312
1308
1306
1306
1306
1306
1306
1309
1321
1328
1306
1307
1307
1318
1306
1306
1310
1306
1306
1306
1314
1326
1330
1312
1308
1306
1306
1306
1307
1310
1318
1313
1335
1306
1315
1313
1307
1307
1314
1307
1306
1306
1306
1307
1306
1326
1306
1306
1306
1306
1313
...

result:

ok 1000 numbers

Test #3:

score: 10
Accepted
time: 1020ms
memory: 125280kb

input:

485803 491610
4 2 5 1 1 1 1 2 1 1 1 1 1 93 9 6 5 2 1 1 1 1 1 2 1 1 1 1 1 1 29 1 1 11 3 1 38 1 37 2 4 1 4 1 88 5 1 1 1 3 1 1 16 239 1 1 3 58 6 2 4 10 99 4 1 3 36 2 1 12 6 10 1 1 1 11 1 245 1 1 1 1 3 26 9 1 1 1 4 18 3 21 199 2 1 1 15 1 3 73 2 1 1 3 1 1123 1 2 1 2 79 12 18 2 1 1 82 2 7 1 123 1 67 1 5 1...

output:

20194694547
19493997007
19313748429
19227113540
19183454881
19137103370
19115112249
19097340334
19085229697
19060305970
19051651040
19044836139
19033261691
19025698226
19015837661
19021910149
19010899898
19003777623
19012438007
18996480084
18996896171
18991515847
18987148855
18988872801
18987176032
...

result:

ok 485803 numbers

Test #4:

score: 0
Wrong Answer
time: 1008ms
memory: 124496kb

input:

497602 455793
110 42 3 46 144 1 5 26 43 17 7 1 2 1 90 1 5 47 1 2 24 3 3 2 1 2 42 1 1 10 1 4 3 116 1 3 1 12 8 1 1 1 1 44 65 1 3 33 1 3 1 70 3 2 110 1 41 1 14 6 1 1 1 1 2 654 5 44 1 10 1 1 51 1 1 1 1 1 118 4 1 692 37 8 47 6074 153 18 179 20 7 1 8 70 5 86 4 12 1 1 1 14 1 15 1 1 3 5 12 1 3 21 261 39 9 1...

output:

10539677758
7695433437
7375046352
7245157001
7181602064
7145207314
7122288754
7105415067
7093022096
7081333064
7075908431
7066799285
7062298205
7056511842
7052357535
7050191590
7047002764
7041270893
7042776793
7043191205
7042963783
7034901740
7034537448
7033352317
7033842290
7031661411
7030586911
70...

result:

wrong answer 1st numbers differ - expected: '10904417211', found: '10539677758'

Test #5:

score: 10
Accepted
time: 1210ms
memory: 127164kb

input:

410863 494517
315605 167 272660 764 1193 76758 165361 315422 61913 359311 69074 75101 91529 41283 181704 199 136706 204701 237333 60064 228582 48986 124350 29453 12587 1269 54671 131785 283380 383 52825 53004 113549 18112 39356 304370 3768 26531 44468 195138 32392 273607 141118 18058 149582 253085 5...

output:

150096
150099
150096
150105
150107
150097
150098
150096
150099
150096
150096
150097
150100
150099
150096
150096
150096
150096
150096
150097
150099
150097
150103
150096
150097
150101
150098
150096
150097
150104
150098
150099
150098
150096
150096
150097
150100
150096
150097
150097
150099
150098
150097...

result:

ok 410863 numbers

Test #6:

score: 10
Accepted
time: 1163ms
memory: 125792kb

input:

402237 497417
1 1 49 1 777 2 1328 39 1 17 3 77 3 286 6 1 4 1 1 1 1 149 1 11 6 100 1 1 5 3 1 1192 1 5 9 7 1 75 6 2 7 11 6 2 2 1 2 3751 2 157 1 5 1 41 61 65 1 1 126 10 6 9 1 1 1 4 1 22 1 1 1 4 5 1 53 1 136 11 1 1 1 1 2 1 2 58 1 1 2 1 1 7 4 3 1 1 7 68 1 2 30 2 103 10 1 37 1 88 168 1 18 1 1 2 58 20 1 27...

output:

5746687845
5746687845
5746553712
5746553218
5746553225
5746585507
5746553221
5747023041
5746823025
5746553219
5746570875
5746553218
5746570875
5746553261
5746560400
5746687845
5746565245
5746687845
5746553219
5746991911
5746752912
5746553218
5746553218
5746556674
5746560400
5746553394
5746553218
574...

result:

ok 402237 numbers

Test #7:

score: 10
Accepted
time: 1082ms
memory: 121676kb

input:

393273 427651
2 1 243 4 1 9 7 1 1 1 1 81 1 3 18 1 3 1 5 1 1 1 1 1 1 1 38 2 1 1 4 90 5 1 9 1 2 1 38 1 4 42 1 1 121 334 9 5 39 1 1 2 1 2 1 1 1 2 15 1 20 15 1 1 9 1 1 404 38 4 1 1 1 44 48 4 1 2 2 3 665 2 1 1 3 1 7 1 1 2 1 1 2 1 1 124 1 6 12 1 2 1 149 4 1 1 26 10 1 4 1 19 1015 31 2 1 1 17 2 154 1 1 2 5 ...

output:

8301966474
8301768331
8301602635
8301779844
8302110023
8301606182
8301602612
8301934049
8301768331
8301966475
8301768331
8301602747
8301602612
8301784929
8301603992
8301602612
8301627134
8301768331
8301602612
8301768331
8301934049
8301768331
8301944642
8301602612
8301602612
8301768331
8301768815
830...

result:

ok 393273 numbers

Test #8:

score: 10
Accepted
time: 1159ms
memory: 122864kb

input:

495491 499412
6 1 1 1 1 1 1 1 4 1 1 3 93 2 1 17 2 5 151 1 1 2 119 1 9 1 128 4 1 1 1 1 1 1 3 12 48 1 3 1 1 30 1 56 1 2 1 1 4 1 1 1 1 1 7 1 1 2 9 5 1 4 2 1 5 1 3 3 1 1 4 9 1 1 3 26 1 33 1 1 1 209 1 238 41 1 37 2 1 1 1 1 29 2 1 14 2 1 1 2 2 1 40 27 1 1 3 1 3 3 1 1 1 120 4 1 1 1 1 2 1 2 1 1 1 1 8 2 9 17...

output:

18338133934
18329315060
18320724899
18316765889
18317326128
18309440979
18312831504
18308335517
18311317339
18307689629
18304402508
18306540636
18304162417
18306677459
18304537208
18304464941
18305963873
18303674437
18304887513
18303979643
18303020202
18302519263
18304834031
18302285031
18304009526
...

result:

ok 495491 numbers

Test #9:

score: 0
Wrong Answer
time: 1374ms
memory: 138148kb

input:

485728 479282
16 7 21 1 1423 303 4 746 46 767 553 1 156 268 1 169 1 2 4 6 2299 4 6 55 1500 242 2 1291 1 1 35 1 1 124 41 9 1 3 2 3 4 1 11 4 4 2 2 1 2 5 82 20 49 123 5 1 51 1 328 17 26 9 3 248 1 5 2995 5 6 5 10 147 5 1 8 1 1 71 1 1 43 3 3 7 100 53 2 69 44 3448 45 33 7 1 1 4 28 97 1 1 223 12 6 369 52 1...

output:

4598267491
4598389044
4598264435
4598381492
4598264438
4598264513
4598278882
4598300416
4598265302
4598381590
4598264462
4598264435
4598270411
4598264529
4598498548
4598264603
4598381492
4598556521
4598278882
4598273385
4598264436
4598278882
4598264435
4598265208
4598266816
4598264541
4598298893
459...

result:

wrong answer 1st numbers differ - expected: '4750722741', found: '4598267491'

Test #10:

score: 10
Accepted
time: 1421ms
memory: 137932kb

input:

499268 499621
1008 256 6 5 150 15 286 3 1 2 1 1 1 5 4 45 1 1 13 1 1 164 1 8 1 2 12 4 1 4 76 5 4 18 1 1 1 24 4 4 1 1 1 1 1 3 2 21 6 1 1 1 1 166 5 1 1 3 54 3 1 5 2 1 1 4 6 1 24 1 990 2 1 2 14 10 4 1 1 19 1 10 1 1 614 1 56 2 188 1 12 6 2 1 2 100 1 1 543 6 28 18 1 1 1 1 5 1 51 163 2 6 915 21 1 2 3 3 1 4...

output:

8031648684
8031648740
8032134205
8031660033
8031648684
8031651545
8031648684
8031829474
8031807614
8031688261
8031807995
8031807648
8031648684
8031660033
8031700655
8031649412
8031810286
8031648684
8031995276
8031807614
8031807614
8031648999
8031648684
8031654940
8031807614
8031727841
8031652559
803...

result:

ok 499268 numbers