首页 > 其他 > 详细

bzoj 1230: [Usaco2008 Nov]lites 开关灯

时间:2019-03-21 20:38:58      阅读:135      评论:0      收藏:0      [点我收藏+]

链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1230

思路: 好像以前写过,很简单的线段树,异或操作直接用长度减去当前值就好了

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid int m = (l + r) >> 1
const int M = 1e5 + 10;
int lazy[M<<2],sum[M<<2];
void pushup(int rt){
    sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}

void pushdown(int l,int r,int rt){
    if(lazy[rt]){
        mid;
        sum[rt<<1] = (m-l+1)-sum[rt<<1];
        sum[rt<<1|1] = (r-m)-sum[rt<<1|1];
        lazy[rt<<1] ^= 1;
        lazy[rt<<1|1] ^= 1;
        lazy[rt] = 0;
    }
}

void update(int L,int R,int l,int r,int rt){
    if(L <= l&&R >= r){
        sum[rt] = (r-l+1)-sum[rt];
        lazy[rt]^=1;
        return ;
    }
    pushdown(l,r,rt);
    mid;
    if(L <= m) update(L,R,lson);
    if(R > m) update(L,R,rson);
    pushup(rt);
}

int query(int L,int R,int l,int r,int rt){
    if(L <= l&&R >= r){
        return sum[rt];
    }
    mid;
    pushdown(l,r,rt);
    int ret = 0;
    if(L <= m) ret += query(L,R,lson);
    if(R > m) ret += query(L,R,rson);
    return ret;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int n,m,op,x,y;
    cin>>n>>m;
    for(int i = 1;i <= m;i ++){
        cin>>op>>x>>y;
        if(op == 0){
            update(x,y,1,n,1);
        }
        else {
            cout<<query(x,y,1,n,1)<<endl;
        }
    }
    return 0;
}

 

bzoj 1230: [Usaco2008 Nov]lites 开关灯

原文:https://www.cnblogs.com/kls123/p/10574086.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!