求助
查看原帖
求助
275860
___A__楼主2024/4/17 18:58

第一个答案就是错的

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
#define int long long
int n,node,stamp,root[N],dfn[N],depth[N],top[N],rnk[N],siz[N],h[N],f[N],dp[N];
vector<int>g[N];
struct segtree{
    int l,r,num;
    segtree(){
        l=r=num=0;
    }
}t[N*25];
void clone(int &u){
    t[++node]=t[u],u=node;
}
void build(int &u,int l,int r){
    clone(u);
    if(l==r){
        return;
    }
    int mid=(l+r)/2;
    build(t[u].l,l,mid),build(t[u].r,mid+1,r);
}
void pushup(int u){
    t[u].num=t[t[u].l].num+t[t[u].r].num;
}
int update(int u,int l,int r,int val){
    clone(u);
    if(l==r){
        t[u].num++;
        return u;
    }
    int mid=(l+r)/2;
    if(val<=mid){
        t[u].l=update(t[u].l,l,mid,val);
    }
    else{
        t[u].r=update(t[u].r,mid+1,r,val);
    }
    pushup(u);
    return u;
}
int query(int u1,int u2,int l,int r,int val){//>val的个数
    if(l==r){
        return t[u2].num-t[u1].num;
    }
    int mid=(l+r)/2;
    if(val>mid){
        return query(t[u1].r,t[u2].r,mid+1,r,val);
    }
    return query(t[u1].l,t[u2].l,l,mid,val)+t[t[u2].r].num-t[t[u1].r].num;
}
void dfs(int u,int last){
    siz[u]=1,depth[u]=depth[last]+1,f[u]=last;
    for(int v:g[u]){
        if(v!=last){
            dfs(v,u),siz[v]+=siz[u];
            if(siz[h[u]]<siz[v]){
                h[u]=v;
            }
        }
    }
}
void dfs(int u,int last,int Top){
    dfn[u]=++stamp,rnk[stamp]=u,top[u]=Top;
    if(h[u]){
        dfs(h[u],u,Top);
    }
    for(int v:g[u]){
        if(v!=h[u]&&v!=last){
            dfs(v,u,v);
        }
    }
}
int query(int l,int r,int num){
    int ret=0;
    while(top[l]!=top[r]){
        if(depth[top[l]]<depth[top[r]]){
            swap(l,r);
        }
        ret+=query(root[dfn[top[l]]-1],root[dfn[l]],1,n,num),l=f[top[l]];
    }
    if(depth[l]<depth[r]){
        swap(l,r);
    }
    ret+=query(root[dfn[r]-1],root[dfn[l]],1,n,num);
    return ret;
}
signed main(){
    cin>>n;
    for(int i=1,u,v;i<n;i++){
        cin>>u>>v,g[u].push_back(v),g[v].push_back(u);
    }
    build(root[0],1,n),dfs(1,1),dfs(1,1,1);
    for(int i=1;i<=n;i++){
        root[dfn[rnk[i]]]=update(root[dfn[rnk[i]]-1],1,n,rnk[i]);
    }
    for(int i=1;i<=n;i++){//1~i的路径上 有多少比他大的
        dp[1]+=query(1,i,i);
    }
    cout<<dp[1]<<" ";
}
2024/4/17 18:58
加载中...