求助树剖,30pts AC #5 #6 #9
查看原帖
求助树剖,30pts AC #5 #6 #9
671294
玄学OIER荷蒻楼主2023/6/8 12:25
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> v[30010];
int cnt[30010],zh21[30010],fa[30010],nw[30010],zd[30010],kkksc03[30010],bh[30010],d[30010];
struct st{
    int l,r;
    int mx,sm;
}a[120010];
void pushup(int xxx){
    a[xxx].sm=a[xxx*2].sm+a[xxx*2+1].sm;
    a[xxx].mx=max(a[xxx*2].mx,a[xxx*2+1].mx);
}
void wo_yao_ji_can(int xxx,int l,int r){
    a[xxx].l=l;
    a[xxx].r=r;
    int mid=(l+r)>>1;
    if (l!=r){
        wo_yao_ji_can(xxx*2,l,mid);
        wo_yao_ji_can(xxx*2+1,mid+1,r);
        pushup(xxx);
    }
    else{
        a[xxx].mx=a[xxx].sm=kkksc03[bh[l]];
    }
}
void change(int x,int c,int t){
    if (a[x].r<c || a[x].l>c) return;
    if (a[x].r==c && a[x].l==c){
        a[x].sm=a[x].mx=t;
        return;
    }
    change(2*x,c,t);
    change(2*x+1,c,t);
    pushup(x);
}
int serch(int x,int l,int r){
    if (l>r) swap(l,r);
    if (a[x].l>=l && a[x].r<=r) return a[x].sm;
    if(a[x].r<l || a[x].l>r) return 0;
    return serch(x*2,l,r)+serch(x*2+1,l,r);
}
int serchm(int x,int l,int r){
    if (l>r) swap(l,r);
    if (a[x].l>=l && a[x].r<=r) return a[x].mx;
    if(a[x].r<l || a[x].l>r) return -138313;
    return max(serchm(x*2,l,r),serchm(x*2+1,l,r));
}
void dfs1(int abc){
    cnt[abc]=1;
    zh21[abc]=-1;
    int kk=-1;
    for (int i=0;i<v[abc].size();i++){
        if (v[abc][i]==fa[abc]) continue;
        fa[v[abc][i]]=abc;
        d[v[abc][i]]=d[abc]+1;
        dfs1(v[abc][i]);
        cnt[abc]+=cnt[v[abc][i]];
        if (cnt[v[abc][i]]>kk) zh21[abc]=v[abc][i],kk=cnt[v[abc][i]];
    }
}
int tme=0;
void dfs2(int arc){
    tme++;
    nw[arc]=tme;
    bh[tme]=arc;
    zd[zh21[arc]]=zd[arc];
    if (zh21[arc]==-1) return;
    dfs2(zh21[arc]);
    for (int i=0;i<v[arc].size();i++){
        if (v[arc][i] != fa[arc] && v[arc][i] !=zh21[arc]) {
            zd[v[arc][i]]=v[arc][i];
            dfs2(v[arc][i]);
        }
    }
}
int qsum(int a,int b){
    int ct=0;
    while (zd[a]!=zd[b]){
        if (d[bh[zd[a]]]>d[bh[zd[b]]]) swap(a,b);
        ct+=serch(1,zd[b],b);
        b=fa[zd[b]];
    }
    if(d[bh[a]]>d[bh[b]]) swap(a,b);
    ct+=serch(1,a,b);
    return ct;
}
int qmax(int a,int b){
    int maxx=-1809238;
    while (zd[a]!=zd[b]){
        
        
        if (d[bh[zd[a]]]>d[bh[zd[b]]]) swap(a,b);
        maxx=max(maxx,serch(1,zd[b],b));
        b=fa[zd[b]];
    }
    if(d[bh[a]]>d[bh[b]]) swap(a,b);
    maxx=max(maxx,serch(1,a,b));
    return maxx;
}
int main()
{
    zd[1]=1;
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for (int i=1;i<=n-1;i++){
        int sto,orz;
        cin>>sto>>orz;
        v[sto].push_back(orz);
        v[orz].push_back(sto);
    }
    dfs1(1);
    dfs2(1);
    for (int i=1;i<=n;i++) cin>>kkksc03[i];
    int m;
    cin>>m;
    wo_yao_ji_can(1,1,n);
    while (m--){
        string s;
        int x,y;
        cin>>s>>x>>y;
        if (s=="QMAX") cout<<qmax(nw[x],nw[y])<<'\n';
        if (s=="QSUM") cout<<qsum(nw[x],nw[y])<<'\n';
        if (s=="CHANGE") change(1,nw[x],y);
    }
    return 0;
}

我不行了,求助万能谷民QWQ

珍爱生命远离树抛!

2023/6/8 12:25
加载中...