玄学错误
查看原帖
玄学错误
654546
qczrz6v4nhp6u楼主2022/8/17 14:43

这是蒟蒻的代码,已A:

#include<bits/stdc++.h>
#define lc (k<<1)
#define rc (k<<1|1)
using namespace std;
const int N=2e5;
int n,m;
bool a[N+5],lztag[N*4+5];
int sum[N*4+5];
void build(int k,int l,int r){
    if(l==r){
        sum[k]=a[l];
        return;
    }
    int mid=l+r>>1;
    build(lc,l,mid);
    build(rc,mid+1,r);
    sum[k]=sum[lc]+sum[rc];
}
void pushdown(int k,int l,int r){
    if(!lztag[k])return;
    int mid=l+r>>1;
    sum[lc]=(mid-l+1)-sum[lc];
    lztag[lc]=!lztag[lc];
    sum[rc]=(r-mid)-sum[rc];
    lztag[rc]=!lztag[rc];
    lztag[k]=0;
}
void change(int k,int l,int r,int x,int y){
    if(r<x||l>y)return;
    if(l==r){
        sum[k]=!sum[k];
        return;
    }
    if(l>=x&&r<=y){
        lztag[k]=!lztag[k];
        sum[k]=(r-l+1)-sum[k];
        return;
    }
    pushdown(k,l,r);
    int mid=l+r>>1;
    change(lc,l,mid,x,y);
    change(rc,mid+1,r,x,y);
    sum[k]=sum[lc]+sum[rc];
}
int query(int k,int l,int r,int x,int y){
    if(r<x||l>y)return 0;
    if(l>=x&&r<=y)return sum[k];
    pushdown(k,l,r);
    int mid=l+r>>1;
    return query(lc,l,mid,x,y)+query(rc,mid+1,r,x,y);
}
int main(){
    scanf("%d%d\n",&n,&m);
    for(int i=1;i<=n;i++){
        char c=getchar();
        a[i]=c^48;
    }
    build(1,1,n);
    while(m--){
        bool op;
        int l,r;
        scanf("%d%d%d",&op,&l,&r);
        if(!op)
            change(1,1,n,l,r);
        else
            printf("%d\n",query(1,1,n,l,r));
    }
}

然而,把while(m--)改成for(int i=1;i<=m;i++)后,在本地运行样例i一直是1i++似乎根本没执行
提交只能得40分(WA6个点),吸氧又能过

求大佬解答

2022/8/17 14:43
加载中...