【线段树】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_),一段中最长的合法区间 ...
随机推荐
- js定义数组的方法
1.定义时赋值 var mycars=new Array("a","b","c") 2.new一个数组对象 var mycars=new A ...
- jfinal的回滚
有两种方法 1. @Before(Tx.class) public void test() throws Exception { } 优点:简单,不需要去处理每个异常,直接抛出异常: 缺点:不能详细的 ...
- 一些Gym三星单刷的比赛总结
RDC 2013, Samara SAU ACM ICPC Quarterfinal Qualification Contest G 思路卡成智障呀! Round 1:对着这个魔法阵找了半天规律,效果 ...
- 大型EMR电子病历源码三甲医院医疗信息管理系统软件网络版
详情请点击查看 开发环境 :VS2010 + C# + ORACLE系统简介:1各种记录的书写,并可保留修改痕迹 在各种记录的书写过程中,根据系统提供的首次护理记录.一般护理记录.术前术后护理记录等模 ...
- spring 整合 shiro框架
shiro是用来干嘛的?从它的官网上(http://shiro.apache.org/)基本可以了解到,她主要提供以下功能: (1)Authentication(认证) (2)Authorizatio ...
- 设计模式的征途—22.中介者(Mediator)模式
我们都用过QQ,它有两种聊天方式:一是私聊,二是群聊.使用QQ群,一个用户就可以向多个用户发送相同的信息和文件,从而无需一一发送,节省大量时间.通过引入群的机制,极大地减少系统中用户之间的两两通信,用 ...
- shell脚本头,#!/bin/sh与#!/bin/bash的区别.
因为今天写了个小脚本,死活不成功,总是报文件或者目录不存在,问了一下我们马同学的正常写法,发现只有脚本头的区别,也就是今天本文要讲的#!/bin/sh与#!/bin/bash. 本文参考:https: ...
- Vue初学跳坑
1. uncaught TypeError: Cannot read property '0' of undefined <div class="home-module-wrap&qu ...
- File文件操作学习总结
1.java.io.file用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录, 2.File类只能用于表示文件(目录)的信息(名称和大小),不能对文件内容进行访问. ...
- PAT1061:Dating
1061. Dating (20) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Sherlock Holme ...