Description

Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一头被连续的编号为1..N, 站在一个彩色的灯下面.刚到傍晚的时候, 所有的灯都是关闭的. 奶牛们通过N个按钮来控制灯的开关; 按第i个按钮可以改变第i个灯的状态.奶牛们执行M (1 <= M <= 100,000)条指令, 每个指令都是两个整数中的一个(0 <= 指令号 <= 1). 第1种指令(用0表示)包含两个数字S_i和E_i (1 <= S_i <= E_i <= N), 它们表示起始开关和终止开关. 奶牛们只需要把从S_i到E_i之间的按钮都按一次, 就可以完成这个指令. 第2种指令(用1表示)同样包含两个数字S_i和E_i (1 <= S_i <= E_i <= N), 不过这种指令是询问从S_i到E_i之间的灯有多少是亮着的. 帮助FJ确保他的奶牛们可以得到正确的答案.

Solution

记录两个量tag和sum,用lazy维护。

刷水+复习线段树。

Code

lazy处理祖先对后代的方法有两种,递归时记录或每次都pushdown,前者常数小但后者更无脑不容易错。

 #include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=4e5+; int tag[maxn],sum[maxn];
int n,m;
int x,p,q,ret; int pushup(int o){
sum[o]=sum[o*]+sum[o*+];
} int pushdown(int o,int l,int r){
int mid=(l+r)>>;
tag[o]=;
tag[o*]^=,tag[o*+]^=;
sum[o*]=(mid-l+-sum[o*]);
sum[o*+]=(r-mid-sum[o*+]);
} void add(int o,int l,int r){
if(p<=l&&r<=q){
tag[o]^=;
sum[o]=(r-l+-sum[o]);
return;
}
if(tag[o]) pushdown(o,l,r);
int mid=(l+r)>>;
if(p<=mid) add(o*,l,mid);
if(q>mid) add(o*+,mid+,r);
pushup(o);
} void ask(int o,int l,int r,int k){
if(p<=l&&r<=q){
if(!k) ret+=sum[o];
else ret+=(r-l+-sum[o]);
return;
}
int mid=(l+r)>>;
if(p<=mid) ask(o*,l,mid,k^tag[o]);
if(q>mid) ask(o*+,mid+,r,k^tag[o]);
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&p,&q);
if(x==) add(,,n);
else{
ret=;
ask(,,n,);
printf("%d\n",ret);
}
}
return ;
}

每次都pushdown代码

 #include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=4e5+; int tag[maxn],sum[maxn];
int n,m;
int x,p,q,ret; int pushup(int o){
sum[o]=sum[o*]+sum[o*+];
} int pushdown(int o,int l,int r){
int mid=(l+r)>>;
tag[o]=;
tag[o*]^=,tag[o*+]^=;
sum[o*]=(mid-l+-sum[o*]);
sum[o*+]=(r-mid-sum[o*+]);
} void add(int o,int l,int r){
if(p<=l&&r<=q){
tag[o]^=;
sum[o]=(r-l+-sum[o]);
return;
}
if(tag[o]) pushdown(o,l,r);
int mid=(l+r)>>;
if(p<=mid) add(o*,l,mid);
if(q>mid) add(o*+,mid+,r);
pushup(o);
} void ask(int o,int l,int r){
if(p<=l&&r<=q){
ret+=sum[o];
return;
}
if(tag[o]) pushdown(o,l,r);
int mid=(l+r)>>;
if(p<=mid) ask(o*,l,mid);
if(q>mid) ask(o*+,mid+,r);
pushup(o);
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&p,&q);
if(x==) add(,,n);
else{
ret=;
ask(,,n);
printf("%d\n",ret);
}
}
return ;
}

【线段树】Bzoj1230 [Usaco2008 Nov]lites 开关灯的更多相关文章

  1. BZOJ1230 [Usaco2008 Nov]lites 开关灯

    区间not,求区间1的个数...线段树裸题 然而窝并不会线段树 我们可以对序列分块,每个块记录0/1的个数和tag表示又没有区间not过就好了 /*************************** ...

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

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

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

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

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

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

  5. B1230 [Usaco2008 Nov]lites 开关灯 线段树

    就是线段树维护异或和.之前我线段树区间修改down都是修改当前区间,结果debug出不来,改成每次向下了. 题干: Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶 ...

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

    嗯嗯,这是一道线段树的题,询问区间内亮着的灯的个数,我们可以把区间修改的线段树改一下,原本的求和改成若有奇数次更改则取反(总长度-亮着的灯个数),而判断是否奇数次只要数组加一个delta的值,upda ...

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

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

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

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

  9. 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel

    题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...

随机推荐

  1. 一种WPF在后台线程更新UI界面的简便方法

    WPF框架规定只有UI线程(主线程)可以更新界面,所有其他后台线程无法直接更新界面.幸好,WPF提供的SynchronizationContext类以及C#的Lambda表达式提供了一种方便的解决方法 ...

  2. Java IO学习--(五)字节和字符数组

    内容列表 从InputStream或者Reader中读入数组 从OutputStream或者Writer中写数组 在java中常用字节和字符数组在应用中临时存储数据.而这些数组又是通常的数据读取来源或 ...

  3. django-debug-toolbar的配置以及使用

    django-debug-toolbar django,web开中,用django-debug-toolbar来调试请求的接口,无疑是完美至极.   可能本人,见识博浅,才说完美至极, 大神,表喷,抱 ...

  4. 解决ecshop3.6 H5版本公告页面为空的修改办法

    ecshop3.6公告页面打开如下,页面完全无效果,如下图. 经过简单美化后,有返回按钮,页面加以美化.如下图. 是不是要好看多了.简单修改几步即可. 修改文件 \appserver\resource ...

  5. 全局程序集缓存GAC

    GAC中的所有的Assembly都会存放在系统目录"%winroot%\assembly下面.放在系统目录下的好处之一是可以让系统管理员通过用户权限来控制Assembly的访问. 目录:C: ...

  6. Activex、OLE、COM、OCX、DLL之间有什么区别?

    来源:http://www.blogjava.net/Jack2007/archive/2008/04/27/196392.html         熟悉面向对象编程和网络编程的人一定对ActiveX ...

  7. windows和centos下安装ActiveMQ

    版本:apache-activemq-5.10.2-bin.zip         (版本5.11+需要jdk7+) 官网: http://activemq.apache.org/download.h ...

  8. Mybatis批量更新数据库与批量插入数据库(以oracle为例)

    一.批量更新 1.普通写法(一条记录update一次,性能比较差,容易造成阻塞.不建议使用) <update id="updateBatch" parameterType=& ...

  9. cocos2d-x_ Windows下Android环境搭建

    在Windows环境下编译cocos2d-x-3.0 Android-NDK编译:cocos2d-x(二) Mac 下搭建:http://www.cocoachina.com/bbs/read.php ...

  10. mvc中路由的映射和实现IHttpHandler挂载

    首先我们了解一下一般的方法 我们只需要在web.config配置文件中做映射处理即可. 第一种形式: <system.web> <urlMappings enabled=" ...