为什么本地和洛谷测的结果不一样
查看原帖
为什么本地和洛谷测的结果不一样
220824
yyz1005楼主2022/7/20 16:27

code:

#include<bits/stdc++.h>
using namespace std;
const int N = 800040;
int tag[N],ans[N],n,m;
bool a[N];
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
void push_up(int id,int l,int r){
    ans[id] = ans[ls(id)]+ans[rs(id)];
}
void build(int id,int l,int r){
	//printf("%d %d %d\n",id,l,r);
    if(l==r){
		ans[id] = a[l];
		return;
	}
    int mid = (l+r)>>1;
    build(ls(id),l,mid);
    build(rs(id),mid+1,r);
    push_up(id,l,r);
}
void tag_down(int id,int l,int r,int x){
    if(x&1){
        tag[id]++;
        ans[id] = (r-l+1)-ans[id];
    }
}
void push_down(int id,int l,int r){
    int mid = (l+r)>>1;
    tag_down(ls(id),l,mid,tag[id]);
    tag_down(rs(id),mid+1,r,tag[id]);
    tag[id] = 0;
}
void update(int id,int l,int r,int ql,int qr){
	//printf("turn around:%d[%d-%d][query %d to %d]\n",id,l,r,ql,qr);
    if(ql<=l&&qr>=r){
        tag[id]++;
        ans[id] = r-l+1-ans[id];
        //printf("all in,ans[%d] = %d\n",id,ans[id]);
        return;
    }
    push_down(id,l,r);
    int mid = (l+r)>>1;
    if(ql<=mid) update(ls(id),l,mid,ql,qr);
    if(qr>mid) update(rs(id),mid+1,r,ql,qr);
    push_up(id,l,r);
}
int query(int id,int l,int r,int ql,int qr){
	//printf("QUERY:%d[%d-%d][query %d to %d]\n",id,l,r,ql,qr);
    if(ql<=l&&qr>=r){
        //printf("all in,ans[%d] = %d\n",id,ans[id]);
        return ans[id];
    }
    push_down(id,l,r);
    int mid = (l+r)>>1,res = 0;
    if(ql<=mid) res = res+query(ls(id),l,mid,ql,qr);
    if(qr>mid) res = res+query(rs(id),mid+1,r,ql,qr);
    return res;
}
int main(){
    scanf("%d%d",&n,&m);
    getchar();
    for(int i = 1; i <= n; i++){
        char ch;
        ch = getchar();
        if(ch=='0') a[i] = false;
        else a[i] = true;
        //cout << i << " " << a[i] <<endl;
    }
    build(1,1,n);
    while (m--){
        int op,l,r;
        scanf("%d%d%d",&op,&l,&r);
        if(op==0){
            update(1,1,n,l,r);
        } else {
            printf("%d\n",query(1,1,n,l,r));
        }
    }
    
    return 0;
}

样例

10 5
1001010110
1 2 3
0 6 9
1 7 10
1 2 5
1 2 7

本地结果

0
1
1
2

洛谷IDE结果

1
2
0
0

正确结果:

0
1
1
2

结果 0pts ,为什么会这样?

2022/7/20 16:27
加载中...