QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#830426 | #4548. Rock Tree | int_R | AC ✓ | 303ms | 32788kb | C++14 | 3.5kb | 2024-12-24 19:37:19 | 2024-12-24 19:37:20 |
Judging History
answer
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const int MAXN=1e5+10;
const ll INF=1e15;
int T,n,k,a[MAXN],dep[MAXN],d[MAXN],h[MAXN],top[MAXN];
ll val[MAXN],rem[MAXN],ans;vector <int> v[MAXN];
namespace SGT
{
int R[MAXN],tot;
struct node{ll num,add;int ls,rs;}t[MAXN<<2];
inline void A(int p,ll z)
{t[p].num+=z,t[p].add+=z;}
inline void push_up(int p)
{t[p].num=max(t[t[p].ls].num,t[t[p].rs].num);}
inline void push_down(int p)
{
A(t[p].ls,t[p].add),A(t[p].rs,t[p].add);
t[p].add=0;return ;
}
void build(int l,int r,int p)
{
t[p].num=t[p].add=0;if(l==r) return ;
t[p].ls=++tot,t[p].rs=++tot;
int mid=(l+r)>>1;
build(l,mid,t[p].ls),build(mid+1,r,t[p].rs);
push_up(p);return ;
}
void get(int l,int r,int p)
{
if(l==r){val[l]=t[p].num;return ;}
int mid=(l+r)>>1;push_down(p);
get(l,mid,t[p].ls),get(mid+1,r,t[p].rs);
push_up(p);return ;
}
void upd(int l,int r,int p,int x,ll z)
{
if(l==r){t[p].num=max(t[p].num,z);return ;}
int mid=(l+r)>>1;push_down(p);
if(x<=mid) upd(l,mid,t[p].ls,x,z);
else upd(mid+1,r,t[p].rs,x,z);
push_up(p);return ;
}
void add(int l,int r,int p,int x,int y,ll z)
{
if(x<=l&&y>=r){A(p,z);return ;}
int mid=(l+r)>>1;push_down(p);
if(x<=mid) add(l,mid,t[p].ls,x,y,z);
if(y>mid) add(mid+1,r,t[p].rs,x,y,z);
push_up(p);return ;
}
ll query(int l,int r,int p,int x,int y)
{
if(x<=l&&y>=r) return t[p].num;
int mid=(l+r)>>1;ll ans=-INF;push_down(p);
if(x<=mid) ans=max(ans,query(l,mid,t[p].ls,x,y));
if(y>mid) ans=max(ans,query(mid+1,r,t[p].rs,x,y));
return ans;
}
}using namespace SGT;
void dfs(int x,int fa=0)
{
d[x]=dep[x]=dep[fa]+1,h[x]=0;
for(int y:v[x])
{
if(y==fa) continue;dfs(y,x);
if(d[y]>d[h[x]]) h[x]=y;
}
if(h[x]) d[x]=d[h[x]];
}
void dp(int x,int fa=0)
{
int T=top[x],l=dep[T],r=d[x],p=R[T];
if(h[x]) top[h[x]]=T,dp(h[x],x);
for(int y:v[x])
{
if(y==fa||y==h[x]) continue;
build(dep[y],d[y],R[y]=++tot);
top[y]=y,dp(y,x);
get(dep[y],d[y],R[y]);
for(int i=dep[y];i<=d[y];++i)
{
int j=k-1+2*dep[x]-i;
if(dep[x]<=min(i-1,j))
rem[i]=query(l,r,p,dep[x],min(i-1,j));
}
ll pre=0;
for(int i=dep[y];i<=d[y];++i)
{
int j=k-1+2*dep[x]-i;
if(max(dep[x],i)>j) break;
if(val[i]<=pre) continue;
add(l,r,p,max(dep[x],i),j,val[i]-pre);
pre=val[i];
}
for(int i=dep[y];i<=d[y];++i)
{
int j=k-1+2*dep[x]-i;
if(dep[x]<=min(i-1,j))
upd(l,r,p,i,rem[i]+val[i]);
}
}
add(l,r,p,dep[x],r,a[x]);
ans=max(ans,query(l,r,p,dep[x],min(dep[x]+k-1,r)));
}
inline void work()
{
cin>>n>>k,ans=-INF,tot=0;
for(int i=1;i<=n;++i)
cin>>a[i],v[i].clear();
for(int i=1,x,y;i<n;++i)
cin>>x>>y,v[x].push_back(y),v[y].push_back(x);
dfs(1),build(1,d[1],R[1]=++tot);
top[1]=1,dp(1);cout<<ans<<'\n';return ;
}
signed main()
{
cin.tie(0),cout.tie(0);
ios::sync_with_stdio(0);
cin>>T;while(T--) work();return 0;
}
详细
Test #1:
score: 100
Accepted
time: 303ms
memory: 32788kb
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