QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#830207#4548. Rock TreeDaiRuiChen007AC ✓599ms32776kbC++172.3kb2024-12-24 16:56:222024-12-24 16:56:22

Judging History

This is the latest submission verdict.

  • [2024-12-24 16:56:22]
  • Judged
  • Verdict: AC
  • Time: 599ms
  • Memory: 32776kb
  • [2024-12-24 16:56:22]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
int n;
struct SegmentTree {
	int tr[MAXN<<2],tg[MAXN<<2];
	void adt(int p,int k) { tr[p]+=k,tg[p]+=k; }
	void psd(int p) { adt(p<<1,tg[p]),adt(p<<1|1,tg[p]),tg[p]=0; }
	void psu(int p) { tr[p]=max(tr[p<<1],tr[p<<1|1]); }
	void init(int l=1,int r=n,int p=1) {
		tr[p]=tg[p]=0;
		if(l==r) return ;
		int mid=(l+r)>>1;
		init(l,mid,p<<1),init(mid+1,r,p<<1|1);
	}
	void add(int ul,int ur,int k,int l=1,int r=n,int p=1) {
		if(ul<=l&&r<=ur) return adt(p,k);
		int mid=(l+r)>>1; psd(p);
		if(ul<=mid) add(ul,ur,k,l,mid,p<<1);
		if(mid<ur) add(ul,ur,k,mid+1,r,p<<1|1);
		psu(p);
	}
	void set(int u,int k,int l=1,int r=n,int p=1) {
		if(l==r) return tr[p]=max(tr[p],k),void();
		int mid=(l+r)>>1; psd(p);
		if(u<=mid) set(u,k,l,mid,p<<1);
		else set(u,k,mid+1,r,p<<1|1);
		psu(p);
	}
	int qry(int ul,int ur,int l=1,int r=n,int p=1) {
		if(ul<=l&&r<=ur) return tr[p];
		int mid=(l+r)>>1; psd(p);
		if(ur<=mid) return qry(ul,ur,l,mid,p<<1);
		if(mid<ul) return qry(ul,ur,mid+1,r,p<<1|1);
		return max(qry(ul,ur,l,mid,p<<1),qry(ul,ur,mid+1,r,p<<1|1));
	}
}	T;
int k,a[MAXN],len[MAXN],hson[MAXN],dfn[MAXN],dcnt;
vector <int> G[MAXN];
void dfs1(int u,int fz) {
	len[u]=1,hson[u]=0;
	for(int v:G[u]) if(v^fz) {
		dfs1(v,u);
		if(len[v]+1>len[u]) len[u]=len[v]+1,hson[u]=v;
	}
}
int f[MAXN],g[MAXN],ans;
int F(int u,int i) {
	return T.qry(dfn[u]+i,dfn[u]+i);
}
void dfs2(int u,int fz) {
	dfn[u]=++dcnt;
	if(hson[u]) dfs2(hson[u],u);
	T.add(dfn[u],dfn[u]+len[u]-1,a[u]);
	for(int v:G[u]) if(v!=fz&&v!=hson[u]) {
		dfs2(v,u);
		int m=min(k-1,len[v]);
		f[0]=a[u],g[0]=0;
		for(int j=1;j<=m;++j) {
			int p=min(j,k-j-1);
			f[j]=max(f[j-1],F(u,j)),g[j]=max(g[j-1],F(v,j-1));
			T.set(dfn[u]+j,max(f[j]+g[p],f[p]+g[j]));
		}
		for(int j=m,p=m+1;j>=1;--j) {
			int q=min(k-j-1,len[u]-1);
			if(p<=q) T.add(dfn[u]+p,dfn[u]+q,g[j]),p=q+1;
		}
	}
	ans=max(ans,T.qry(dfn[u],dfn[u]+min(len[u]-1,k-1)));
}
void solve() {
	cin>>n>>k;
	for(int i=1;i<=n;++i) cin>>a[i],G[i].clear();
	for(int i=1,u,v;i<n;++i) cin>>u>>v,G[u].push_back(v),G[v].push_back(u);
	dfs1(1,0),dcnt=0,T.init(),ans=*max_element(a+1,a+n+1),dfs2(1,0),cout<<ans<<"\n";
}
signed main() {
	ios::sync_with_stdio(false);
	int _; cin>>_;
	while(_--) solve();
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 599ms
memory: 32776kb

input:

88
49707 15234
-53 -7 34 -79 25 -63 -3 58 -60 -29 -64 -51 81 -45 -22 73 -46 7 -17 10 24 -81 -75 85 -19 88 46 12 0 -87 21 -88 -71 -2 61 50 24 48 -48 -67 46 43 87 59 -60 97 71 19 -36 91 54 73 25 -62 -92 74 10 100 52 -4 -11 65 89 65 -100 -79 77 -53 41 5 65 -47 77 20 -25 0 5 10 82 -21 27 31 91 -85 -57 -...

output:

1539829
47120
1779436
9475
100
2015
1166766
2833267
61582773
34428
186218
7915
62876367
83732
24766
9992
486
1799544
-1
7966
6266
9012
5770
1151949
7258
399
5526
24745
8213
119391577
11
7810
8851
7288
16694
8546
768
1
12759
1252
6510
1607629
231818575
6869
27986
11151
11221
199
4587
1410036
28210
12...

result:

ok 88 lines