【题意概述】

  给出一个01序列,初始时序列全为0,每次有修改操作或询问操作,修改操作要求把L~R区间中的0变成1,1变成0,查询操作要求输出L~R区间的1的个数

【题解】

  线段树。

  每次区间修改把区间的$sum$改为$len-sum$即可。

#include<cstdio>
#include<algorithm>
#define ls (cur<<1)
#define rs (cur<<1|1)
#define len(x) (a[x].r-a[x].l+1)
#define mid ((a[cur].l+a[cur].r)>>1)
using namespace std;
const int maxn=400010;
int n,m,x,y,z;
struct tree{int l,r,sum,c;}a[maxn];
void read(int &k){
k=0; int f=1; char c=getchar();
while (c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
while ('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
k*=f;
}
void build(int cur,int l,int r){
a[cur].l=l; a[cur].r=r;
if (l<r) build(ls,l,mid),build(rs,mid+1,r);
}
void pushdown(int cur){
if (len(cur)==0||a[cur].c==0) return;
a[ls].c=1-a[ls].c; a[ls].sum=len(ls)-a[ls].sum;
a[rs].c=1-a[rs].c; a[rs].sum=len(rs)-a[rs].sum;
a[cur].c=0;
}
void update(int cur,int l,int r){
if (l<=a[cur].l&&a[cur].r<=r) a[cur].c=1-a[cur].c,a[cur].sum=len(cur)-a[cur].sum;
else{
pushdown(cur);
if (l<=mid) update(ls,l,r);
if (r>mid) update(rs,l,r);
a[cur].sum=a[ls].sum+a[rs].sum;
}
}
int query(int cur,int l,int r){
if (l<=a[cur].l&&a[cur].r<=r) return a[cur].sum;
else{
pushdown(cur); int ret=0;
if (l<=mid) ret+=query(ls,l,r);
if (r>mid) ret+=query(rs,l,r);
return ret;
}
}
int main(){
read(n); read(m); build(1,1,n);
for (int i=1;i<=m;i++){
read(x); read(y); read(z);
if (x==0) update(1,y,z);
else printf("%d\n",query(1,y,z));
}
return 0;
}

  

BZOJ 1230 Usaco2008 Nov 开关灯的更多相关文章

  1. BZOJ 1230 Usaco2008 Nov 开关灯 线段树

    思路: 用线段树模拟题中的操作就好 (标记异或 长度=区间总长度-当前已开灯的长度) //By SiriusRen #include <cstdio> using namespace st ...

  2. BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )

    线段树.. --------------------------------------------------------------------------------- #include< ...

  3. BZOJ 1230 [Usaco2008 Nov]lites 开关灯:线段树异或

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1230 题意: 有n盏灯,一开始全是关着的. 有m次操作(p,a,b).p为0,则将区间[a ...

  4. bzoj:1230: [Usaco2008 Nov]lites 开关灯

    Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每 ...

  5. bzoj 1230: [Usaco2008 Nov]lites 开关灯【线段树】

    在线段树上记录长度.区间01翻转标记.当前1个数.传递tag的时候用长度-1个数即可 #include<iostream> #include<cstdio> using nam ...

  6. 1230: [Usaco2008 Nov]lites 开关灯

    1230: [Usaco2008 Nov]lites 开关灯 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1162  Solved: 589[Sub ...

  7. BZOJ 1229: [USACO2008 Nov]toy 玩具

    BZOJ 1229: [USACO2008 Nov]toy 玩具 标签(空格分隔): OI-BZOJ OI-三分 OI-双端队列 OI-贪心 Time Limit: 10 Sec Memory Lim ...

  8. BZOJ 1620: [Usaco2008 Nov]Time Management 时间管理( 二分答案 )

    二分一下答案就好了... --------------------------------------------------------------------------------------- ...

  9. BZOJ 1231: [Usaco2008 Nov]mixup2 混乱的奶牛( dp )

    状压dp dp( x , S ) 表示最后一个是 x , 当前选的奶牛集合为 S , 则状态转移方程 : dp( x , S ) =  Σ dp( i , S - { i } )  ( i ∈ S , ...

随机推荐

  1. java Map 转 List

    public static void testMapVoid () { Map map = new HashMap(); map.put("a", "a1"); ...

  2. bzoj2253

    cdq分治+dp 看见三维偏序是cdq,互相包含是最长上升子序列 这个代码是错的 交了两份代码,发现手动出数据是不一样的... 不调了 #include<bits/stdc++.h> us ...

  3. Spark 机器学习------逻辑回归

    package Spark_MLlib import javassist.bytecode.SignatureAttribute.ArrayType import org.apache.spark.s ...

  4. E20170919-hm

    infinity   n. <数>无穷大; 无限的时间或空间;

  5. [Swift通天遁地]四、网络和线程-(3)线程组:使用DispatchGroup(调度组)对线程进行分组管理

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. selenium3 + python - 异常处理截图 screenshot

    一.截图方法 1.get_screenshot_as_file(self, filename) --这个方法是获取当前window的截图,出现IOError时候返回False,截图成功返回True. ...

  7. Gson 转日期中的错误

    今天在用Gson做json转化是遇到一个问题,本地执行没有问题(windows 7),包丢到服务器上(Centos)就报错了. 后经分析发现DateTypeDapter类中取本地环境的日期格式参考ht ...

  8. Eclipse 添加 YAML插件

    官网:https://github.com/oyse/yedit 离线版本:(链接: https://pan.baidu.com/s/1PJzkS1tI-VigZvfbYXUh9A 密码: gfep) ...

  9. ANDROID 开发之 SQLite

    SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLit ...

  10. 4CSS颜色和背景

    ---------------------------------------------------------------------------------------------------- ...