萌新不知道为什么又T又WA的31pts

P3038 [USACO11DEC] Grass Planting G

tuzhewen @ 2020-12-01 23:03:57

#include<bits/stdc++.h>
#define F(i,l,r) for(register int i=l;i<=r;i++)
#define D(i,r,l) for(register int i=r;i>=l;i--)
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define p_b push_back
#define m_p make_pair
#define il inline
#define fi first
#define se second
const int INF=0x3f3f3f3f,N=1e5+5;
using namespace std;
int n,m;
int u,v;
struct node {
    int from,to,val,nxt;
}e[N<<1];
int ecnt,head[N];
void add(int u,int v) {
    e[++ecnt].from=u;
    e[ecnt].to=v;
    e[ecnt].nxt=head[u];
    head[u]=ecnt;
}
int fa[N],dep[N],top[N],son[N],siz[N],pos[N],cnt;
char op[2];
void dfs1(int now,int pre) {
    fa[now]=pre,dep[now]=dep[pre]+1,siz[now]=1;
    for(int i=head[now];~i;i=e[i].nxt) {
        int to=e[i].to;
        if(to!=pre) {
            dfs1(to,now);
            siz[now]+=siz[to];
            if(siz[son[now]]<siz[to]) son[now]=to;
        }
    }
}
void dfs2(int now,int pre) {
    if(son[now]) {
        top[son[now]]=top[now];
        pos[son[now]]=++cnt;
        dfs2(son[now],now);
    }
    else return ;
    for(int i=head[now];~i;i=e[i].nxt) {
        int to=e[i].to;
        if(to!=pre&&to!=son[now]) {
            top[to]=to;
            pos[to]=++cnt;
            dfs2(to,now);
        }
    }
}
ll ans[N<<2],tag[N<<2];
il int ls(int x) {return x<<1;}
il int rs(int x) {return x<<1|1;}
il void push_up(int p) {ans[p]=ans[ls(p)]+ans[rs(p)];}
il void f(int p,int l,int r,ll k) {
    ans[p]+=(r-l+1)*k;
    tag[p]+=k;
}
il void push_down(int p,int l,int r) {
    if(tag[p]) {
        int mid=(l+r)>>1;
        f(ls(p),l,mid,tag[p]);
        f(rs(p),mid+1,r,tag[p]);
        tag[p]=0;
    }
}
il void upd(int p,int l,int r,int nl,int nr,ll k) {
    if(nl<=l&&nr>=r) {
        f(p,l,r,k);
        return ;
    }
    push_down(p,l,r);
    int mid=(l+r)>>1;
    if(nl<=mid) upd(ls(p),l,mid,nl,nr,k);
    if(nr>mid) upd(rs(p),mid+1,r,nl,nr,k);
    push_up(p);
}
il ll query(int p,int l,int r,int ql,int qr) {
    if(ql<=l&&qr>=r) return ans[p];
    push_down(p,l,r);
    int mid=(l+r)>>1;ll res=0;
    if(ql<=mid) res+=query(ls(p),l,mid,ql,qr);
    if(qr>mid) res+=query(rs(p),mid+1,r,ql,qr);
    return res;
}
il int upd_chain(int u,int v,int k) {
    int fu=top[u],fv=top[v];
    while(fu!=fv) {
        if(dep[fu]<dep[fv]) swap(fu,fv),swap(u,v);
        upd(1,1,n,pos[fu],pos[u],k);
        u=fa[u],fu=top[u];
    }
    if(dep[u]>dep[v]) swap(u,v);
    upd(1,1,n,pos[u]+1,pos[v],k);
}
int main() {
    mem(head,-1);
    scanf("%d%d",&n,&m);
    F(i,1,n-1) {
        scanf("%d%d",&u,&v);
        add(u,v),add(v,u);
    }
    dfs1(1,0);dep[1]=1;cnt=pos[1]=1,top[1]=1;dfs2(1,0);
    while(m--) {
        scanf("%s %d%d",op,&u,&v);
        if(op[0]=='P') {
            upd_chain(u,v,1);
        }
        if(op[0]=='Q') {
            if(fa[u]==v) printf("%lld\n",query(1,1,n,pos[u],pos[u]));
            else printf("%lld\n",query(1,1,n,pos[v],pos[v]));
        }
    }
    return 0;
}

求助神仙!


by ttys000 @ 2020-12-11 20:41:01

萌新。。


|