社区讨论

有大佬 #6 WA 过吗?

CF343DWater Tree参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo1buc9x
此快照首次捕获于
2023/10/22 18:29
2 年前
此快照最后确认于
2023/11/02 18:51
2 年前
查看原帖
自闭,数据真大。
CPP
#include<bits/stdc++.h>
#define dbgvar(x) printf("%s = ",#x);cout << x << endl;
#define dbgarr(x,len) printf("show %s:  ",#x);\
for(int ccf = 1;ccf <= len;ccf ++){\
cout << x[ccf] << " ";\
}\
cout << endl;
using namespace std;
const int N = 500005;
vector<int> e[N];
int n,m;
int son[N],depth[N],fa[N],siz[N];
int dfn[N],rnk[N],top[N],idx;
void dfs1(int u){//求出重儿子、子树大小、父亲、深度
    son[u] = -1;
    siz[u] = 1;
    for(auto v:e[u]){
        if(depth[v])continue;
        depth[v] = depth[u] + 1;
        fa[v] = u;
        dfs1(v);
        siz[u] += siz[v];
        if(son[u] == -1 || siz[son[u]] < siz[v]){
            son[u] = v;
        }
    }
}
void dfs2(int u,int t){//求出dfs序,重链顶端
    dfn[u] = ++idx;
    rnk[u] = idx;
    top[u] = t;
    if(son[u] != -1){
        dfs2(son[u],t);
    }
    for(auto v:e[u]){
        if(fa[u] == v || son[u] == v)continue;
        dfs2(v,v);
    }
}
struct node{
    int l,r;
    int tag;
    int dat;
}tr[N*4];
void pushup(int u){
    tr[u].dat = tr[u<<1].dat + tr[u<<1|1].dat;
}
void pushdown(int u){
    if(tr[u].tag != -1){
        node &l = tr[u<<1];
        node &r = tr[u<<1|1];
        node &t = tr[u];
        l.tag = r.tag = t.tag;
        l.dat = (l.r - l.l + 1) * l.tag;
        r.dat = (r.r - r.l + 1) * r.tag;
        t.tag = -1;
    }
}
void build(int u,int l,int r){
    if(l == r){
        tr[u] = {l,r,-1,0};
        return;
    }
    tr[u].l = l,tr[u].r = r;
    int mid = tr[u].l + tr[u].r >> 1;
    build(u<<1,l,mid);build(u<<1|1,mid+1,r);
}

void modify(int u,int l,int r,int x){
    if(l <= tr[u].l && tr[u].r <= r){
        tr[u].tag = x;
        tr[u].dat = (tr[u].r - tr[u].l + 1) * x;
        return;
    }
    pushdown(u);
    int mid = tr[u].l + tr[u].r >> 1;
    if(l <= mid)modify(u<<1,l,r,x);
    if(r > mid)modify(u<<1|1,l,r,x);
    pushup(u);
}

int query(int u,int x){
    if(tr[u].l == x && tr[u].r == x)
        return tr[u].dat;
    pushdown(u);
    int mid = tr[u].l + tr[u].r >> 1;
    if(x <= mid)return query(u<<1,x);
    else return query(u<<1|1,x);
}

void settree(int u){
    modify(1,dfn[u],dfn[u]+siz[u]-1,1);
}

void clear(int u){
    while(top[u] != 1){
        modify(1,dfn[top[u]],dfn[u],0);
        u = fa[top[u]];
    }
    modify(1,dfn[1],dfn[u],0);
}
int main(){
    cin >> n;
    for(int i = 1;i < n;i ++){
        int x,y;
        cin >> x >> y;
        e[x].push_back(y);
        e[y].push_back(x);
    }
    depth[1] = 1;
    fa[1] = 1;
    dfs1(1);
    top[1] = 1;
    dfs2(1,1);
    // dbgarr(fa,n);
    // dbgarr(son,n);
    // dbgarr(depth,n);
    // dbgarr(siz,n);
    // dbgarr(dfn,n);
    // dbgarr(top,n);
    build(1,1,n);
    cin >> m;
    while(m --){
        int op,x;
        cin >> op >> x;
        if(op == 1)settree(x);
        if(op == 2)clear(x);
        if(op == 3) cout << query(1,x) << endl;
    }
    return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...