洛谷 p3870 開關 線段樹模板

這兩天學了很長時間因而作了一道水題c++

我就用了模板,就連任何優化都沒有優化

就AC了,複雜度也很爆炸10個點1500多毫秒spa

這個題就是把lazy[]改爲記錄下修改的次數,每次修改的時候mod 2,由於反過來再返回去就同樣了code

修改變成ci

sum[root] = r - l + 1 - sum[root];

其餘的幾乎就沒區別了get

#include<bits/stdc++.h>

using namespace std;

inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
inline void write(int x) {if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); }

int sum[400010],lazy[400010];

void add(int root,int l,int r,int k){
    if(k == 0)//若是不修改的話直接退出就行了
        return ;
    lazy[root] += k;//記錄次數
    sum[root] = r - l + 1 - sum[root];//修改
    lazy[root] %= 2;//2之外的毫無心義
    return ;
}

void putdown(int root,int l,int r){
    if(lazy[root] == 0)//沒有標記不下發
        return ;
    int mod = lazy[root] % 2; int mid = (l + r) >> 1;
    add(root * 2,l,mid,mod);//左右孩子下發
    add(root * 2 + 1,mid + 1,r,mod);
    lazy[root] = 0;//標記清空
    return ;
}

void change(int root,int l,int r,int x,int y){
    if(l > y || r < x)//不在範圍內退出(好像不必)
        return ;
    if(l >= x && r <= y){//徹底在範圍內就標記而後下發
        add(root,l,r,1);
        return ;
    }
    int mid = (l + r) >> 1;
    putdown(root,l,r);//標記不到正確位置就繼續發
    int left = root << 1;
    int right = left + 1;
    if(x <= mid) change(left,l,mid,x,y);
    if(mid < y) change(right,mid + 1,r,x,y);
    sum[root] = sum[left] + sum[right];//更新父節點
}

int find(int root,int l,int r,int x,int y){
    if(l >= x && r <= y){//徹底包含加上返回
        return sum[root];
    }
    int mid = (l + r) >> 1,ans = 0;
    int left = root << 1;
    int right = left + 1;
    putdown(root,l,r);//傳到須要的地方
    if(x <= mid) ans += find(left,l,mid,x,y);
    if(mid < y) ans += find(right,mid + 1,r,x,y);
    return ans;
}

int main(){
    int n,m;
    cin >> n >> m;
    for(int i = 1; i <= m;++i){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        if(x == 0){
            change(1,1,n,y,z);
        }
        else{
            write(find(1,1,n,y,z));
            cout<<endl;
        }
    }
    return 0;
}
相關文章
相關標籤/搜索