社区讨论

CFF877E求调

题目总版参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lo2jyslx
此快照首次捕获于
2023/10/23 15:04
2 年前
此快照最后确认于
2023/10/23 15:04
2 年前
查看原帖
CPP
#include <stdio.h>
const int maxn=4e5+5;
int head[maxn],cnt;
struct edge{
    int to,next;
}e[maxn]; 
void addedge(int u,int v){
    e[++cnt]=(edge){v,head[u]};
    head[u]=cnt;
}
int size[maxn],a[maxn],pos;
bool num1[maxn],num2[maxn];
void dfs(int x){
    size[x]=1;
    a[x]=++pos;
    num2[pos]=num1[x];
    for(int i=head[x];i;i=e[i].next){
        int to=e[i].to;
        dfs(to);
        size[x]+=size[to];
    }
}
int val[maxn];
bool lazy[maxn];
void pushdown(int rt,int l,int r){
    if(lazy[rt]){
        lazy[rt]=0;
        lazy[rt<<1]^=1;
        lazy[rt<<1|1]^=1;
        int mid=(l+r)>>1;
        val[rt<<1]=(mid-l+1)-val[rt<<1];
        val[rt<<1|1]=(r-mid)-val[rt<<1|1];
    }
}
void pushup(int rt){
    val[rt]=val[rt<<1]+val[rt<<1|1];
}
void build(int rt,int l,int r){
    if(l==r){
        val[rt]=num2[l];
        return;
    }
    int mid=(l+r)>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    pushup(rt);
}
void update(int rt,int L,int R,int l,int r){
    if(l>R || r<L){
        return;
    }
    if(l>=L && r<=R){
        lazy[rt]^=1;
        val[rt]=(r-l+1)-val[rt];
        return;
    }
    int mid=(l+r)>>1;
    pushdown(rt,l,r);
    update(rt << 1, L, R, l, mid);
    update(rt << 1 | 1, L, R ,mid + 1, r);
    pushup(rt);
}
int query(int rt, int l, int r, int L, int R) {
    if (l > R || r < L) {
        return 0;
    }
    if (L <= l && r <= R) {
        return val[rt];
    }
    pushdown(rt, l, r);
    int mid = (l + r) >> 1;
    return query(rt << 1, l, mid, L, R) + query(rt << 1 | 1, mid + 1, r, L, R);
}
int n,m;
int main(){
    freopen("job.in","r",stdin);
    freopen("job.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=2;i<=n;i++){
        int u;
        scanf("%d",&u);
        addedge(u,i);
    }
    for(int i=1;i<=n;i++){
        scanf("%d",&num1[i]);
    }
    dfs(1);
    build(1,1,n);
    while(m--){
        int p,q;
        scanf("%d %d",&p,&q);
        if(p==1){
            update(1,a[q],a[q]+size[q]-1,1,n);
        }else{
            printf("%d\n",query(1,1,n,a[q],a[q]+size[q]-1));
        }
    }
    return 0;
}

回复

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

正在加载回复...