【线段树】Bzoj1230 [Usaco2008 Nov]lites 开关灯
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 开关灯的更多相关文章
- BZOJ1230 [Usaco2008 Nov]lites 开关灯
区间not,求区间1的个数...线段树裸题 然而窝并不会线段树 我们可以对序列分块,每个块记录0/1的个数和tag表示又没有区间not过就好了 /*************************** ...
- BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )
线段树.. --------------------------------------------------------------------------------- #include< ...
- 1230: [Usaco2008 Nov]lites 开关灯
1230: [Usaco2008 Nov]lites 开关灯 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1162 Solved: 589[Sub ...
- BZOJ 1230 [Usaco2008 Nov]lites 开关灯:线段树异或
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1230 题意: 有n盏灯,一开始全是关着的. 有m次操作(p,a,b).p为0,则将区间[a ...
- B1230 [Usaco2008 Nov]lites 开关灯 线段树
就是线段树维护异或和.之前我线段树区间修改down都是修改当前区间,结果debug出不来,改成每次向下了. 题干: Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶 ...
- P1230: [Usaco2008 Nov]lites 开关灯
嗯嗯,这是一道线段树的题,询问区间内亮着的灯的个数,我们可以把区间修改的线段树改一下,原本的求和改成若有奇数次更改则取反(总长度-亮着的灯个数),而判断是否奇数次只要数组加一个delta的值,upda ...
- bzoj 1230: [Usaco2008 Nov]lites 开关灯【线段树】
在线段树上记录长度.区间01翻转标记.当前1个数.传递tag的时候用长度-1个数即可 #include<iostream> #include<cstdio> using nam ...
- bzoj:1230: [Usaco2008 Nov]lites 开关灯
Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每 ...
- 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel
题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...
随机推荐
- 使用XStream是实现XML与Java对象的转换(6)--持久化
九.持久化 在第八节的示例中,当我们操作一组对象时,我们可以指定Writer.OutputStream来写出序列化后的XML数据,我们还可以指定Reader.InputStream来读取序列化后的XM ...
- IT轮子系列(一)——DropDownList 的绑定,你秒懂了吗
前言 最近猛然惊觉(说是猛然,是因为自己工作那么多年,居然不自知.不反省),在开发中,自己碰到一些常用的功能代码块,还是习惯性的baidu,然后copy....这样的操作,不知自己重复了多少遍.现在回 ...
- 超强js博客值得学习!!!
再读ecmascript 摘要: 这几天,又花了点时间看了下ecmascript.以下是我摘录出来的一些理解.在此记录下.第一部分:关于变量对象的理解1) 什么是变量对象?数据的存取与读取机制,就是变 ...
- Tomcat中常见线程说明
http://blog.csdn.NET/jeff_fangji/article/details/41786205 本文讲述了Tomcat的常见线程的功能.名称.线程池和配置等信息,其中源码来自于To ...
- Jmeter(二十六)_数据驱动测试
花了一点时间做了一个通用的执行引擎,好处就是我不用再关注测试脚本的内容,而是用测试用例的数据去驱动我们执行的方向.(这个只适合单个接口的测试,具体运用到接口自动化时,还是要靠手动去编写脚本!) 首先我 ...
- 基于Python的数据分析(3):文件和时间
在接下来的章节中,我会重点介绍一下我自己写的基于之前做python数据分析的打包接口文件common_lib,可以认为是专用于python的第三方支持库.common_lib目前包括文件操作.时间操作 ...
- 算法训练 2的次幂表示(蓝桥杯C++写法)
问题描述 任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001. 将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0 ...
- 云计算一:VMware workstation的安装和使用教程
VMware workstation的安装和使用教程 一.VMware 安装 1.从网上找到VMware的安装包以及要安装的映像文件,下载到本地,然后备份一份存储到百度云盘. 链接:http://pa ...
- 第六章 MySQL 查询
查询数据表 语法: SELECT {* | <字段列表>} [ FROM <表1>, <表2>.... [ where <表达式> ] [ group ...
- python 闯关之路三(面向对象与网络编程)
1,简述socket 通信原理 如上图,socket通信建立在应用层与TCP/IP协议组通信(运输层)的中间软件抽象层,它是一组接口,在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/ ...