萌新刚学OI,求调树剖,37pts其他全部RE

P3038 [USACO11DEC] Grass Planting G

syta @ 2022-08-15 19:29:41

rt,虽然树剖这种恶心东西可能没人调,不过我翻遍提交记录发现没有一个37pts的/dk

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m;
vector<int> g[N];
int f[N],dep[N],siz[N],mxson[N];
int dfn[N],top[N];
void dfs1(int x,int fa){
    f[x]=fa;
    dep[x]=dep[fa]+1;
    siz[x]=1;
    for(int i=0;i<g[x].size();i++){
        int to=g[x][i];
        if(to==fa)continue;
        dfs1(to,x);
        siz[x]+=siz[to];
        if(siz[mxson[x]]<siz[to])mxson[x]=to;
    }
}
int cnt;
void dfs2(int x,int topf){
    top[x]=topf;
    dfn[x]=++cnt;
    if(!mxson[x])return;
    dfs2(mxson[x],topf);
    for(int i=0;i<g[x].size();i++){
        int to=g[x][i];
        if(to==f[x]||to==mxson[x])continue;
        dfs2(to,to);
    }
}
struct tree{
    int l,r,tag;
}t[N*4];
void build(int l,int r,int p){
    t[p].l=l,t[p].r=r;
    t[p].tag=0;
    if(l==r)return;
    int mid=(l+r)>>1;
    build(l,mid,p<<1);
    build(mid+1,r,p<<1|1);
}
void modify(int lx,int rx,int p){
    if(t[p].l==lx&&t[p].r==rx){
        t[p].tag++;
        return;
    }
    int mid=(t[p].l+t[p].r)>>1;
    if(rx<=mid)modify(lx,rx,p<<1);
    else if(lx>mid)modify(lx,rx,p<<1|1);
    else{
        modify(lx,mid,p<<1);
        modify(mid+1,rx,p<<1|1);
    }
}
void update_route(int x,int y){
    while(top[x]!=top[y]){
        if(dep[top[x]]>=dep[top[y]]){
            modify(dfn[top[x]],dfn[x],1);
            x=f[top[x]];
        }else{
            modify(dfn[top[y]],dfn[y],1);
            y=f[top[y]];
        }
    } 
    if(dep[x]<dep[y])modify(dfn[x]+1,dfn[y],1);
    else modify(dfn[y]+1,dfn[x],1);
}
int query(int x,int p){
    if(t[p].l==t[p].r)return t[p].tag;
    int ans=t[p].tag;
    int mid=(t[p].l+t[p].r)>>1;
    if(x<=mid)ans+=query(x,p<<1);
    else ans+=query(x,p<<1|1);
    return ans;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<n;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs1(1,0);
    dfs2(1,1);
    build(1,n,1);
    while(m--){
        char opt[5];
        int u,v;
        scanf("%s%d%d",opt,&u,&v);
        if(opt[0]=='P'){
            update_route(u,v);
        }else{
            if(dep[u]<dep[v])swap(u,v);
            printf("%d\n",query(dfn[u],1));
        }
    }
    return 0;
} 

by Saka_Noa @ 2022-08-15 19:42:02

你的区间加是不是写假了


by spark_minous @ 2022-08-15 19:42:03

%%%syt


by Saka_Noa @ 2022-08-15 19:45:28

@sabkx 初始全为0


by Saka_Noa @ 2022-08-15 19:45:55

@sabkx 不需要


by syta @ 2022-08-15 19:47:31

@Himezaka_noai 欸是吗?我就照着区间加单点查的标记永久化线段树写的/dk


by syta @ 2022-08-15 19:48:42

@sabkx 是的就像那位dalao说的一样,我觉得都是0就没pushup


by Saka_Noa @ 2022-08-15 19:49:19

@syta 永久标记吗,我没写过,那我看错了


by waauto @ 2022-08-15 19:55:31

modify加一句话

    if(t[p].r<lx|t[p].l>rx)return;

by waauto @ 2022-08-15 19:56:30

另外,lazytag不用初始化


by syta @ 2022-08-15 19:56:50

@RainL A了谢谢喵


| 下一页