QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#830426#4548. Rock Treeint_RAC ✓303ms32788kbC++143.5kb2024-12-24 19:37:192024-12-24 19:37:20

Judging History

This is the latest submission verdict.

  • [2024-12-24 19:37:20]
  • Judged
  • Verdict: AC
  • Time: 303ms
  • Memory: 32788kb
  • [2024-12-24 19:37:19]
  • Submitted

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