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. Fullpage参数说明

    参数说明 $(document).ready(function() { $('#fullpage').fullpage({ //Navigation menu: false,//绑定菜单,设定的相关属 ...

  2. MySql 行转列 存储过程实现

    同学们在使用mysql的过程中,会遇到一个行转列的问题,就是把多条数据转化成一条数据 用多列显示. 方法1. 实现方式用下面的存储过程,表名对应的修改就行. BEGIN declare current ...

  3. 排序算法入门之归并排序(java实现)

    归并排序是采用分治法的典型应用. 参考<数据结构与算法分析-Java语言描述> 归并排序其实要做两件事: (1)"分解"--将序列每次折半划分. (2)"合并 ...

  4. javascript学习(二)javascript常见问题总结

    在js使用过程中,经常会碰到一些问题,本人利用闲暇时间整理了一些常见问题的解决方法,贴出来和大家分享,有需要的朋友可以参考下 1.JS中方法和变量都是区分大小写的  2.单引号.双引号在JS中没有特殊 ...

  5. List内存分配

    当采用默认构造函数List<int> value = new List<int>();实例化一个List<T>对象时,.Net Framework只是在内存中申请了 ...

  6. 如何将程序集安装到全局程序集缓存GAC

    针对一些类库项目或用户控件项目(一般来说,这类项目最后编译生成的是一个或多个dll文件),在程序开发完成后,有时需要将开发的程序集(dll文件)安装部署到GAC(全局程序集缓存)中,以便其他的程序也可 ...

  7. 简单剖析Node中的事件监听机制(一)

    使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用 ...

  8. .net捕捉全局未处理异常的3种方式

    前言: 我们在实际项目开发中,经常会遇到一些不可预见的异常产生,有的异常在程序运行时就对其进行处理(try)但是,有的程序不需要每一个地方都用try进行处理,那么针对这种情况,可以参照下面的方式,实现 ...

  9. python笔记:#007#变量

    变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 ...

  10. oracle数据库语句积累

    1.从一个表选出数据更新另一个表(后面的exists一定要加) update jqhdzt set shid = (select shid from v_plat_userjqinfo t where ...