求助
查看原帖
求助
226113
火羽白日生楼主2020/6/26 12:25

只过了样例(哭

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>

//#pragma GCC optimize(2)  //吸氧
//#pragma GCC optimize(3,"Ofast","inline")  //吸臭氧

typedef long long ll;
typedef unsigned long long ull;
using namespace std;

inline ll read(){
    char ch=getchar();
    ll x=0,w=1;
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<3)+(x<<1)+(ch^48);
        ch=getchar();
    }
    return x*w;
}

ll n,m,a[200005],sum[800005],tag[800005];
char s[200005];
ll ls(ll p){
    return p*2;
}
ll rs(ll p){
    return p*2+1;
}
void pushup(ll p){
    sum[p]=sum[ls(p)]+sum[rs(p)];
}
void build(ll p,ll l,ll r){
    if(l==r){
        sum[p]=a[l];
        return;
    }
    ll mid=(l+r)/2;
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    pushup(p);
}
void f(ll p,ll l,ll r){
    tag[p]^=1;
    sum[p]=r-l+1-sum[p];
}
void pushdown(ll p,ll l,ll r){
    if(tag[p]==0)
        return;
    ll mid=(l+r)/2;
    f(ls(p),l,mid);
    f(rs(p),mid+1,r);
    tag[p]=0;
}
void update(ll tl,ll tr,ll p,ll l,ll r){
    if(tl<=l&&r<=tr){
        f(p,l,r);
        return;
    }
    pushdown(p,l,r);
    ll mid=(l+r)/2;
    if(tl<=mid)
        update(tl,tr,ls(p),l,mid);
    if(tr>mid)
        update(tl,tr,rs(p),mid+1,r);
    pushup(p);
}
ll query(ll tl,ll tr,ll p,ll l,ll r){
    ll res=0;
    if(tl<=l&&r<=tr)
        return sum[p];
    pushdown(p,l,r);
    ll mid=(l+r)/2;
    if(tl<=mid)
        res+=query(tl,tr,ls(p),l,mid);
    if(tr>mid)
        res+=query(tl,tr,rs(p),mid+1,r);
    return res;
}
int main(int argc, const char * argv[]){
    ios::sync_with_stdio(false);
    cin.tie(0);
    n=read();m=read();
    for(ll i=1;i<=n;i++)
        cin>>s[i];
    for(ll i=1;i<=n;i++)
        a[i]=s[i]-'0';
    build(1,1,n);
    for(ll i=1;i<=m;i++){
        ll op,x,y;
        op=read();x=read();y=read();
        if(op==0)
            update(x,y,1,1,n);
        if(op==1)
            cout<<query(x,y,1,1,n)<<"\n";
    }
    return 0;
}

2020/6/26 12:25
加载中...