QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#830207 | #4548. Rock Tree | DaiRuiChen007 | AC ✓ | 599ms | 32776kb | C++17 | 2.3kb | 2024-12-24 16:56:22 | 2024-12-24 16:56:22 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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