题目链接: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 开关灯:线段树异或的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. BZOJ 1230 Usaco2008 Nov 开关灯 线段树

    思路: 用线段树模拟题中的操作就好 (标记异或 长度=区间总长度-当前已开灯的长度) //By SiriusRen #include <cstdio> using namespace st ...

  7. 【线段树】Bzoj1230 [Usaco2008 Nov]lites 开关灯

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

  8. BZOJ 1230 Usaco2008 Nov 开关灯

    [题意概述] 给出一个01序列,初始时序列全为0,每次有修改操作或询问操作,修改操作要求把L~R区间中的0变成1,1变成0,查询操作要求输出L~R区间的1的个数 [题解] 线段树. 每次区间修改把区间 ...

  9. BZOJ1230 [Usaco2008 Nov]lites 开关灯

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

随机推荐

  1. angular 视频教程

    在网上找了一些,视频教程.存在备用 angular 视频教程 百度云盘地址 小时前 1小时前 30 6 angular 4.0视频教程 链接:https://pan.baidu.com/s/1qXIt ...

  2. jenkins构建一个python项目

    Jenkins发布后端python代码 “系统管理”“管理插件”“已安装” 检查是否有“Git plugin”和“Publish Over SSH”两个插件,如果没有,则需点击“可选插件”,找到它 ...

  3. android一步一步实现视频clientapp(一)

    我开发完毕了一个完整的视频clientapp.如今.分享出来.供刚開始学习的人学习參考(大神就不用看了,比較简单,仅供入门),大家相互交流相互学习. 项目有些功能,我时间也不是非常多.仅仅能时不时更新 ...

  4. 37:密码截取(回文串manacher算法)

    题目描述:Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解.比如 ...

  5. npm常用命令(转)

    npm install <name>安装nodejs的依赖包 例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本, ...

  6. matlab2017b linux版分享

    链接:https://pan.baidu.com/s/1smrTkFN 密码:cvb3 下载后请点关注并点赞,谢谢支持.

  7. Django之站内搜索-Solr,Haystack

    java -version 不多说 solr 是java 开发的 java version "1.7.0_79" Java(TM) SE Runtime Environment ( ...

  8. 设置jvm运行内存

    :1.右击项目—Bulid Path—Configure Build Path—Libraries,找到JRE System Libraary[Sun JDK 1.6.0_13],选中JRE Syst ...

  9. Appium python Uiautomator2 多进程问题

    appium更新uiautomator后可以获取tost了,大家都尝试,课程中也讲解了,但是这些跑的时候都在单机上,当我们多机并发的时候会出现一个端口问题,因为我们appium最后会调用uiautom ...

  10. 关于erlang的-run 的启动参数

    在github上,关于erlang的一致性hash,有erlang-ryng和 hash_ring .在这里先聊下erlang-ryng这个. 在erlang-ryng的启动方式上,github上提供 ...