BZOJ 1230 [Usaco2008 Nov]lites 开关灯:线段树异或
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1230
题意:
有n盏灯,一开始全是关着的。
有m次操作(p,a,b)。p为0,则将区间[a,b]内的所有灯反转;p为1,则输出[a,b]中有多少盏灯是亮的。
题解:
线段树区间异或。
与一般线段树有两点不同:
(1)更新lazy时为:lazy ^= 1
(2)更新dat时为:dat = len - dat
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 500005
#define INF 10000000 using namespace std; int n,m;
int tot;
int dat[MAX_N];
int lazy[MAX_N];
int lson[MAX_N];
int rson[MAX_N]; void init_segment()
{
tot=;
memset(dat,,sizeof(dat));
memset(lazy,,sizeof(lazy));
memset(lson,-,sizeof(lson));
memset(rson,-,sizeof(rson));
} void create_kid(int now)
{
if(lson[now]==-) lson[now]=tot++;
if(rson[now]==-) rson[now]=tot++;
} void push_down(int now,int len)
{
if(lazy[now])
{
dat[lson[now]]=len-(len>>)-dat[lson[now]];
dat[rson[now]]=(len>>)-dat[rson[now]];
lazy[lson[now]]^=lazy[now];
lazy[rson[now]]^=lazy[now];
lazy[now]=;
}
} void push_up(int now)
{
dat[now]=dat[lson[now]]+dat[rson[now]];
} void update(int a,int b,int k,int l,int r,int x)
{
if(a<=l && r<=b)
{
dat[k]=r-l+-dat[k];
lazy[k]^=x;
return;
}
if(r<a || b<l) return;
create_kid(k);
push_down(k,r-l+);
int mid=(l+r)>>;
update(a,b,lson[k],l,mid,x);
update(a,b,rson[k],mid+,r,x);
push_up(k);
} void query(int a,int b,int k,int l,int r,int &sum)
{
if(a<=l && r<=b)
{
sum+=dat[k];
return;
}
if(r<a || b<l) return;
create_kid(k);
push_down(k,r-l+);
int mid=(l+r)>>;
query(a,b,lson[k],l,mid,sum);
query(a,b,rson[k],mid+,r,sum);
} int main()
{
init_segment();
scanf("%d%d",&n,&m);
int p,a,b;
for(int i=;i<m;i++)
{
scanf("%d%d%d",&p,&a,&b);
if(p==) update(a,b,,,n,);
else
{
int sum=;
query(a,b,,,n,sum);
printf("%d\n",sum);
}
}
}
BZOJ 1230 [Usaco2008 Nov]lites 开关灯:线段树异或的更多相关文章
- BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )
线段树.. --------------------------------------------------------------------------------- #include< ...
- B1230 [Usaco2008 Nov]lites 开关灯 线段树
就是线段树维护异或和.之前我线段树区间修改down都是修改当前区间,结果debug出不来,改成每次向下了. 题干: Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶 ...
- 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) 头奶牛中的每 ...
- 1230: [Usaco2008 Nov]lites 开关灯
1230: [Usaco2008 Nov]lites 开关灯 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1162 Solved: 589[Sub ...
- BZOJ 1230 Usaco2008 Nov 开关灯 线段树
思路: 用线段树模拟题中的操作就好 (标记异或 长度=区间总长度-当前已开灯的长度) //By SiriusRen #include <cstdio> using namespace st ...
- 【线段树】Bzoj1230 [Usaco2008 Nov]lites 开关灯
Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每 ...
- BZOJ 1230 Usaco2008 Nov 开关灯
[题意概述] 给出一个01序列,初始时序列全为0,每次有修改操作或询问操作,修改操作要求把L~R区间中的0变成1,1变成0,查询操作要求输出L~R区间的1的个数 [题解] 线段树. 每次区间修改把区间 ...
- BZOJ1230 [Usaco2008 Nov]lites 开关灯
区间not,求区间1的个数...线段树裸题 然而窝并不会线段树 我们可以对序列分块,每个块记录0/1的个数和tag表示又没有区间not过就好了 /*************************** ...
随机推荐
- TCP/IP详解 卷一(第七、八章 Ping、Traceroute程序)
Ping程序 Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达. 该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答. ping程序还能测出到这台主机的往返时 ...
- 学写jQuery插件开发方法
jQuery如此流行,各式各样的jQuery插件也是满天飞.你有没有想过把自己的一些常用的JS功能也写成jQuery插件呢?如果你的答案是肯定的,那么来吧!和我一起学写jQuery插件吧! 很多公 ...
- SharePoint 2013 对话框
The quick way to open a sharepoint 2013 dialog modal form is via Javascript below 1 2 3 4 5 function ...
- Python 2.7 升 3.4
Ubuntu 14.04 已经安装有python3.4.0 命令行使用python3 或者创建链接即可 ln -s /usr/bin/python3 /usr/bin/python [推荐此方法,然后 ...
- Web前端开发--JS技术大梳理
什么是JS JavaScript是一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语 ...
- 10个经典Java面试题
1.Java的HashMap是怎样工作的? HashMap是一个针对数据结构的键值.每一个键都会有对应的值.关键是识别这种值. HashMap 基于 hashing 原理,我们通过 put ()和 g ...
- 修改登陆织梦后台的“DedeCMS 提示信息”
修改方法: 在dedecms程序的include目录中找到文件common.func.php并对其进行编辑,把其中的“DedeCMS 提示信息”修改为自己想要的内容提示: 在dedecms程序的默认管 ...
- 编译webrtc for android库与apk
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH=`pwd`/depot_t ...
- 【LeetCode】Balanced Binary Tree 解题报告
[题目] Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bi ...
- Java知识点梳理——常用方法总结
1.查找字符串最后一次出现的位置 String str = "my name is zzw"; int lastIndex = str.lastIndexOf("zzw& ...