萌新求救

P3038 [USACO11DEC] Grass Planting G

Unordered_OIer @ 2021-07-27 21:43:48

#include<bits/stdc++.h>
#define N 100005
using namespace std;
typedef long long ll;
inline ll read(){
    ll x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
inline void write(ll x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
inline void writeln(ll x){write(x),putchar('\n');}
struct node{ll l,r,sum,tag;}st[N<<2];
struct edge{ll to,nxt;}es[N<<1];
ll n,m,tot,hd[N],sz[N];
ll son[N],d[N],p[N],top[N];
ll dfn[N],rk[N],cnt;
inline void add(ll u,ll v){es[++tot]=(edge){v,hd[u]},hd[u]=tot;}
inline ll len(ll x){return st[x].r-st[x].l+1;}
inline void build(ll x,ll l,ll r){
    st[x]=(node){l,r,0,0};
    if(l==r)return;
    ll mid=(l+r)>>1;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
}
inline void pushup(ll x){
    st[x].sum=st[x<<1].sum+st[x<<1|1].sum;
}
inline void pushdown(ll x){
    st[x<<1].tag+=st[x].tag;
    st[x<<1].sum+=len(x)*st[x].tag;
    st[x<<1|1].tag+=st[x].tag;
    st[x<<1|1].sum+=len(x)*st[x].tag;
    st[x].tag=0;
}
inline void update(ll l,ll r,ll k,ll x){
    if(st[x].l>r||st[x].r<l)return;
    if(st[x].l>=l&&st[x].r<=r){
        st[x].tag+=k;
        st[x].sum+=len(x)*k;
        return;
    }
    pushdown(x);
    update(l,r,k,x<<1);
    update(l,r,k,x<<1|1);
    pushup(x);
}
inline ll query(ll k,ll x){
    if(st[x].l==st[x].r)return st[x].sum;
    if(k<=st[x<<1].r)return query(k,x<<1);
    else return query(k,x<<1|1);
}
inline void dfs1(ll u,ll fa){
    d[u]=d[fa]+1,sz[u]=1,p[u]=fa;
    for(ll i=hd[u];i;i=es[i].nxt){
        ll v=es[i].to;
        if(v==fa)continue;
        dfs1(v,u);
        sz[u]+=sz[v];
        if(sz[son[u]]<sz[v])son[u]=v;
    }
}
inline void dfs2(ll u,ll tp){
    top[u]=tp,dfn[u]=++cnt,rk[cnt]=u;
    if(son[u])dfs2(son[u],tp);
    for(ll i=hd[u];i;i=es[i].nxt){
        ll v=es[i].to;
        if(v==son[u]||v==p[u])continue;
        dfs2(v,v);//新重链
    }
}
inline void updPath(ll x,ll y,ll c){
    while(top[x]!=top[y]){
        if(d[top[x]]<d[top[y]])swap(x,y);
        update(dfn[top[x]],dfn[x],c,1);
        x=p[top[x]];
    }
    if(d[x]>d[y])swap(x,y);
    update(dfn[x]+1,dfn[y],c,1);
}
int main(){
    n=read(),m=read();
    for(ll i=1,u,v;i<n;i++){
        u=read(),v=read();
        add(u,v),add(v,u);
    }
    dfs1(1,0),dfs2(1,1);
    build(1,1,n);
    for(ll i=1,u,v;i<=m;i++){
        char op;
        cin>>op;
        u=read(),v=read();
        if(op=='P')updPath(u,v,1);
        else writeln(p[u]==v?query(dfn[u],1):query(dfn[v],1));
    }
    return 0;
}

WA 成 31pts(


by James_w_l @ 2021-07-28 08:27:51

您还萌新?别搞笑了......


by Ryan_jiang07 @ 2021-08-03 08:55:32

完 全 同 意


|