QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#303522#7419. Jiry Matchingsxztmax67TL 2632ms67440kbC++145.6kb2024-01-12 17:47:192024-01-12 17:47:20

Judging History

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

  • [2024-06-05 15:26:21]
  • hack成功,自动添加数据
  • (/hack/645)
  • [2024-01-12 17:47:20]
  • 评测
  • 测评结果:TL
  • 用时:2632ms
  • 内存:67440kb
  • [2024-01-12 17:47:19]
  • 提交

answer

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define pii pair<int,int>
#define fi first
#define se second
#define mk make_pair
#define pb push_back
#define ll long long 
using namespace std;
const int N=2e5+100;
const ll inf=1e18;
int n,dfn_tot;
int top[N],en[N],dfn[N],id[N],fav[N],siz[N],son[N];
vector<pii>g[N]; 
void dfs1(int x,int fa,int faz)
{
	if(fa)g[x].erase(find(g[x].begin(),g[x].end(),mk(fa,faz)));
	siz[x]=1;for(auto t:g[x])
	{
		int y=t.fi,z=t.se;fav[y]=z;
		dfs1(y,x,z),siz[x]+=siz[y];
		if(siz[son[x]]<siz[y])son[x]=y;
	}
	if(son[x])g[x].erase(find(g[x].begin(),g[x].end(),mk(son[x],fav[son[x]])));
}
struct Poly
{
	int L,R,tag;//顶端(dfn 序)  + 左边是否一定和右边相同 
	vector<ll>dp[2][2];//左端匹配/未匹配 + 右端匹配/未匹配 
	auto&operator[](const int&x){return dp[x];}
	Poly(){clear(1);dp[0][0][0]=0;tag=1;}
	void clear(int siz)
	{
		L=R=0;for(int a:{0,1})for(int b:{0,1})
			{dp[a][b].resize(siz);for(auto&x:dp[a][b])x=-inf;}
	}
	Poly add(int p,int v) 
	{
		int siz=dp[0][0].size()+1;
		Poly now;now.clear(siz);now.L=now.R=p;now.tag=1;
		for(int i=0;i<siz-1;i++)
			now[0][0][i]=max({now[0][0][i],dp[0][0][i],dp[0][1][i],dp[1][1][i],dp[1][0][i]}),
			now[1][1][i+1]=max({now[1][1][i+1],dp[0][0][i]+v,dp[0][1][i]+v});
		return now;
	}
	friend Poly merge1(Poly&x,Poly&y)//其中 Lx=Rx=Ly=Ry
	{
		#define max(x,y) ((x<y)?y:x)
		int siz=x[0][0].size()+y[0][0].size()-1;
		Poly now;now.clear(siz);now.L=now.R=x.L;now.tag=1;
		for(int t1:{0,1})for(int t2:{0,1})
		{
			if(t1==1&&t2==1)continue;
			int t=t1|t2;now[t][t][0]=max(now[t][t][0],x[t1][t1][0]+y[t2][t2][0]);
			int px=0,py=0;for(int i=1;i<siz;i++)
			{
				if(px==x[t1][t1].size()-1)py++;
				else if(py==y[t2][t2].size()-1)px++;
				else if(x[t1][t1][px+1]+y[t2][t2][py]>
				     x[t1][t1][px]+y[t2][t2][py+1])px++;else py++;
				now[t][t][i]=max(now[t][t][i],x[t1][t1][px]+y[t2][t2][py]);
			}
//			cout<<x[t1][t1].size()<<" "<<y[t2][t2].size()<<" "<<px<<" "<<py<<' '<<siz<<endl;
		}
		return now;
	} 
	friend Poly merge2(Poly&x,Poly&y)//其中 [Lx Rx][Ly,Ry]  Ly=Rx+1
	{
		int v=fav[dfn[y.L]],sx=x[0][0].size(),sy=y[0][0].size(),siz=sx+sy;
		Poly now;now.clear(siz);now.L=x.L;now.R=y.R;now.tag=0;
		for(int t1:{0,1})for(int t2:{0,1})
		{
			now[t1][t2][0]=max(now[t1][t2][0],max(x[t1][0][0],x[t1][1][0])+max(y[0][t2][0],y[1][t2][0]));
			int px=0,py=0;for(int i=1;i<siz-1;i++)
			{
				if(px==sx-1)py++;
				else if(py==sy-1)px++;
				else if(max(x[t1][0][px+1],x[t1][1][px+1])+max(y[0][t2][py],y[1][t2][py])>
				        max(x[t1][0][px],x[t1][1][px])+max(y[0][t2][py+1],y[1][t2][py+1]))px++;else py++;
				now[t1][t2][i]=max(now[t1][t2][i],max(x[t1][0][px],x[t1][1][px])+max(y[0][t2][py],y[1][t2][py]));
			}
//			if(x.tag&&t1)continue;if(y.tag&&t2)continue;
			now[x.tag|t1][y.tag|t2][1]=max(now[x.tag|t1][y.tag|t2][1],x[t1][0][0]+y[0][t2][0]+v);
			px=0,py=0;for(int i=2;i<siz;i++)
			{
				if(px==sx-1)py++;
				else if(py==sy-1)px++;
				else if(x[t1][0][px+1]+y[0][t2][py]>x[t1][0][px]+y[0][t2][py+1])px++;else py++;
				now[x.tag|t1][y.tag|t2][i]=max(now[x.tag|t1][y.tag|t2][i],x[t1][0][px]+y[0][t2][py]+v);
			}
			#undef max
		}
//		if(v==5)cout<<x[0][0][0]<<" "<<y[0][0][0]<<' '<<x.tag<<" "<<y.tag<<endl;
		return now;
		/*
			now[t1][t2][a+b] = max(x[t1][0/1][a]+y[0/1][t2][b],
							       x[t1][0][a(-1)]+y[0][t2][b(-1)])
		*/
	}
};
Poly dp[N];
void dfs2(int x,int topf)
{
	top[x]=topf;
	dfn[id[x]=++dfn_tot]=x;en[top[x]]=id[x];
//	cout<<x<<' '<<topf<<' '<<fav[x]<<endl;
//	dp[x].clear(1);dp[x].L=dp[x].R=id[x];dp[x][0][0][0]=0;
	if(son[x])
	{
		dfs2(son[x],topf);
//		dp[x]=dp[son[x]].add(id[x],fav[son[x]]),dp[son[x]].clear(0);
	}
	for(auto t:g[x])
	{
		int y=t.fi;dfs2(y,y);
//		dp[x]=merge1(dp[x],dp[y].add(id[x],t.se));
//		dp[y].clear(0);
	}
}
void get(int l,int r)
{
	if(l>=r)return;
	int p=l+r>>1;
	//[l,p] 和 [p+1,r] 
//	for(int i=l+1;i<r;i++)
//		if(min(siz[dfn[l]]-siz[son[dfn[p]]],siz[son[dfn[p]]]-siz[son[dfn[r]]])<
//		   min(siz[dfn[l]]-siz[son[dfn[i]]],siz[son[dfn[i]]]-siz[son[dfn[r]]]))p=i;
//	cout<<l<<" "<<r<<' '<<p<<endl;exit(0);
//	cout<<l<<" "<<r<<" "<<dfn[p]<<' '<<son[dfn[p]]<<" "<<siz[son[dfn[p]]]<<endl;
//	cout<<l<<" "<<r<<' '<<dfn[p]<<' '<<son[dfn[p]]<<" "<<dfn[p+1]<<' '<<siz[son[dfn[p]]]<<endl;
	get(l,p);get(p+1,r);
	if(p+1<=r)dp[dfn[l]]=merge2(dp[dfn[l]],dp[dfn[p+1]]),dp[dfn[p+1]].clear(0);
//	cout<<"Seg:"<<" "<<dfn[l]<<' '<<l<<" "<<r<<endl;
//	for(auto y:dp[dfn[l]][0][0])cout<<y<<" ";cout<<endl;
//	for(auto y:dp[dfn[l]][1][0])cout<<y<<' ';cout<<endl;
//	for(auto y:dp[dfn[l]][0][1])cout<<y<<" ";cout<<endl;
//	for(auto y:dp[dfn[l]][1][1])cout<<y<<' ';cout<<endl;
}
void solve(int l,int r)
{
	for(int i=l;i<=r;i++)
	{
		int x=dfn[i];for(auto t:g[x])
		{
			int y=t.fi;solve(id[y],en[y]);
			Poly T=dp[y].add(id[x],t.se);dp[x]=merge1(dp[x],T);
			dp[y].clear(0);
		}
		dp[x].L=dp[x].R=id[x];dp[x].tag=1;
	}
	get(l,r);
}
signed main()
{
//	freopen("r.in","r",stdin);
//	freopen("my.out","w",stdout);
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1,x,y,z;i<n;i++)cin>>x>>y>>z,g[x].push_back(mk(y,z)),g[y].push_back(mk(x,z)) ;
	dfs1(1,0,0);dfs2(1,1);
//	if(n==100000)exit(0);
	solve(1,en[1]);
//	exit(0);
	for(int i=1;i<n;i++)
	{
//		cout<<dp[1][0][0].size()<<endl;
		if(i>=dp[1][0][0].size()){cout<<"? ";continue;}
		ll v=max({dp[1][0][0][i],dp[1][0][1][i],dp[1][1][0][i],dp[1][1][1][i]});
		if(v<-1e15)cout<<"? ";else cout<<v<<' ';
	}
//	cout<<dp[1][0][0][4]<<" "<<dp[1][0][1][4]<<' '<<dp[1][1][0][4]<<" "<<dp[1][1][1][4]<<endl;
	cout<<endl;
	return 0;
}
/*
5
1 2 3
2 3 5
3 4 6
4 5 1 
*/

详细

Test #1:

score: 100
Accepted
time: 20ms
memory: 59804kb

input:

5
1 2 3
2 3 5
2 4 4
3 5 2

output:

5 6 ? ? 

result:

ok single line: '5 6 ? ? '

Test #2:

score: 0
Accepted
time: 24ms
memory: 58644kb

input:

10
2 8 -5
5 10 5
3 4 -5
1 6 5
3 9 5
1 7 -3
4 8 -5
10 8 -5
1 8 -3

output:

5 10 15 10 ? ? ? ? ? 

result:

ok single line: '5 10 15 10 ? ? ? ? ? '

Test #3:

score: 0
Accepted
time: 36ms
memory: 60468kb

input:

2
1 2 35

output:

35 

result:

ok single line: '35 '

Test #4:

score: 0
Accepted
time: 29ms
memory: 59272kb

input:

100
75 98 770328247
87 98 -219729992
98 35 578758971
98 93 -348642106
63 98 -638036803
83 25 -744163505
21 98 810313834
97 25 131957988
19 98 -711567435
8 25 68874404
43 98 184473508
28 94 171940607
92 28 971759198
51 98 -674532123
28 6 797727320
98 95 1154600
98 58 683765502
28 12 358426364
4 42 65...

output:

990461444 1951945471 2906346403 3825083089 4484694703 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 

result:

ok single line: '990461444 1951945471 290634640... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '

Test #5:

score: 0
Accepted
time: 24ms
memory: 59676kb

input:

203
139 160 -585848305
172 95 -541522893
170 39 5557137
106 39 -778170145
3 95 -436330773
39 6 -437501664
16 130 -452155774
65 148 68947909
160 62 959671488
109 39 -800234924
39 69 -419168940
23 16 876930246
95 84 393547919
11 39 640235516
37 95 100755747
39 36 930905421
95 103 150613974
39 60 55894...

output:

980020055 1939691543 2855429156 3756427595 4562844897 4346623326 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?...

result:

ok single line: '980020055 1939691543 285542915... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '

Test #6:

score: 0
Accepted
time: 22ms
memory: 60648kb

input:

406
77 136 -97512557
231 136 542346963
130 177 -388708409
390 136 686852490
342 127 883069794
128 136 477257139
254 136 -475703031
136 32 -928318588
136 295 510781030
102 342 871598741
137 214 648132758
342 3 697615122
136 120 -301371460
406 43 154140155
406 55 921120861
72 371 88488927
183 136 -146...

output:

996418061 1986908701 2975920530 3898989188 4755959611 5559326552 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?...

result:

ok single line: '996418061 1986908701 297592053... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '

Test #7:

score: 0
Accepted
time: 33ms
memory: 59556kb

input:

812
72 362 -368276642
362 196 -634964868
362 743 -833364678
244 362 78813293
111 20 -210495433
455 362 455557250
229 64 -426691307
756 362 139006554
362 143 473229314
20 534 -699191624
158 362 93363463
312 20 -859248217
157 362 180458703
362 731 299520404
20 323 -735699279
20 742 -812381447
439 20 1...

output:

999034642 1995939938 2980594575 3958550949 4917179479 5765897258 6449371168 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ...

result:

ok single line: '999034642 1995939938 298059457... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '

Test #8:

score: 0
Accepted
time: 33ms
memory: 60940kb

input:

1625
1142 1405 -551024632
385 1543 919271125
398 981 264110458
385 1176 -413402000
123 385 736435016
252 385 718332198
1294 385 34067686
981 267 -384479151
1552 385 793504414
23 385 -694334331
1197 385 385229583
1016 385 -467572952
536 385 439439632
769 385 358175397
385 858 -647141736
385 178 -3958...

output:

999537220 1998889246 2996051177 3986098023 4948945555 5833220615 6655752159 6915163854 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?...

result:

ok single line: '999537220 1998889246 299605117... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '

Test #9:

score: 0
Accepted
time: 38ms
memory: 60080kb

input:

3250
2887 101 258851508
2017 1662 546412652
1662 629 -28215881
1756 1662 450358858
2981 1692 799511924
3193 1662 363320660
1692 905 -323671345
1692 2935 19706073
2913 3047 -25735169
1149 2887 -805060913
1692 461 824382188
1692 2403 929982454
2509 721 -147417737
1662 770 -721376313
1260 1662 -1568571...

output:

999996265 1997699858 2994629552 3984126644 4965926521 5932717085 6881879351 7821660229 8728166024 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ...

result:

ok single line: '999996265 1997699858 299462955... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '

Test #10:

score: 0
Accepted
time: 80ms
memory: 60908kb

input:

7500
4955 6802 -495321867
6802 2205 -674830428
6287 3296 931013751
6802 7002 -972370682
5968 6802 -4844061
6802 4769 239749327
1694 6802 -468455800
6802 976 158103224
6802 5250 381161328
5281 6802 -109984276
4676 2299 563014102
2299 297 -529154962
4317 2436 861997552
3474 2299 938353692
6802 6742 11...

output:

999621933 1999210349 2998150687 3996516968 4992090923 5980299116 6965962239 7791569767 8521331693 9157667141 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?...

result:

ok single line: '999621933 1999210349 299815068... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '

Test #11:

score: 0
Accepted
time: 185ms
memory: 61984kb

input:

12500
12420 8595 -255200982
11605 5490 845231189
8595 5721 390643780
5512 5490 268180812
11132 10795 956887552
7633 8595 -622785013
7562 8595 513664257
9744 8595 -675715598
6080 8595 999680752
11864 8595 -967505600
9961 8595 613622983
1356 12167 808408582
2383 8595 -476729851
6969 11132 -942417500
2...

output:

999858209 1999538961 2999084473 3998464234 4997801190 5996643071 6995458737 7992421815 8922828463 9776715075 9864436704 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ...

result:

ok single line: '999858209 1999538961 299908447... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '

Test #12:

score: 0
Accepted
time: 661ms
memory: 62992kb

input:

25000
17077 20165 -507412418
18419 20161 618820479
19707 19850 -175193487
20165 14994 943405292
20165 24206 -167254127
20706 20165 171657772
21119 20165 116133390
4987 20165 42216677
11925 11458 -917266631
3554 20165 -419663469
3565 9374 453456629
17577 20165 -721380063
23667 10268 616472024
11078 2...

output:

999925482 1999836258 2999615985 3999293406 4997527596 5994797398 6990387648 7966039593 8937696974 9843700482 10677729598 11067646897 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?...

result:

ok single line: '999925482 1999836258 299961598... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '

Test #13:

score: 0
Accepted
time: 2632ms
memory: 67440kb

input:

50000
18500 2466 792046417
18500 44110 -900904087
21015 11984 -737928618
28173 41859 -519214580
30313 18500 -301917017
42387 41859 -974702020
11984 24167 146595056
18500 21584 903989466
18500 37467 556499768
41859 19205 -9960474
3769 39568 914049493
44621 18500 187544463
18500 15381 -10251112
11984 ...

output:

999937917 1999800424 2999565993 3999252320 4998654018 5997015278 6995342886 7990129710 8964115429 9930869200 10864301226 11747795394 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?...

result:

ok single line: '999937917 1999800424 299956599... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '

Test #14:

score: -100
Time Limit Exceeded

input:

100000
41120 8939 -908804331
41120 59419 937439044
56449 26963 281860304
56449 40366 164393802
70598 56449 17660671
32292 56449 661439314
89841 56449 850663169
56997 56449 -284803758
12053 13650 -277296534
76004 13650 367404917
13650 64459 -238013272
39862 56449 248682228
54227 19569 -913307595
4112...

output:


result: