题目传送门

题目大意,给你一串灯,按一下开关可以将灯的状态取反(开变成关,关变成开)。维护这个序列的两种操作:询问区间内有多少灯是开着的,区间按灯。


开始想的是分别维护区间内0的数量,1的数量,两个懒标记。后来真正写到维护懒标记的时候却感觉不太可行,因为你并不精确的知道区间内哪里是开着,哪里是关着的。


其实我们本质上就是在维护整个异或序列。因为把每个位置取反,实际上就是在进行异或运算。(0->1,1->0)。这样我们在区间修改的时候,只需要维护区间内1的个数,把它用区间长度减去原来的值便得到新值。而懒标记的维护,直接进行异或运算即可。因为懒标记实际上就是在告诉儿子节点怎么做,传递简单的修改无法维护的信息。所以直接异或即可。

这个问题还有一个加加加加加加强版,bzoj1858,有时间干掉他。

Code

 #include<cstdio>
#include<algorithm>
#define maxn 100090 using namespace std; int n,m;
struct SegmentTree{
int l,r,len;
int val,lazy;
}t[maxn*]; void build(int p,int l,int r)
{
t[p].l=l,t[p].r=r,t[p].len=r-l+;
if(l==r)
return ;
int mid=(l+r)>>;
build(p*,l,mid);
build(p*+,mid+,r);
} void update(int p)
{
if(t[p].l==t[p].r) return ;
if(!t[p].lazy) return ;
t[p*].val=t[p*].len-t[p*].val;
t[p*+].val=t[p*+].len-t[p*+].val;
t[p*].lazy^=;
t[p*+].lazy^=;
t[p].lazy=;
} void change(int p,int l,int r)
{
update(p);
if(t[p].l==l&&t[p].r==r)
{
t[p].lazy^=;
t[p].val=t[p].len-t[p].val;
return ;
}
int mid=(t[p].l+t[p].r)>>;
if(l>mid) change(p*+,l,r);
else if(r<=mid) change(p*,l,r);
else change(p*,l,mid),change(p*+,mid+,r);
t[p].val=t[p*].val+t[p*+].val;
} int ask(int p,int l,int r)
{
update(p);
if(t[p].l==l&&t[p].r==r) return t[p].val;
int mid=(t[p].l+t[p].r)>>;
if(l>mid) return ask(p*+,l,r);
else if(r<=mid) return ask(p*,l,r);
else return ask(p*,l,mid)+ask(p*+,mid+,r);
} int main()
{
scanf("%d%d",&n,&m);
build(,,n);
for(int i=;i<=m;i++)
{
int opt=,l=,r=;
scanf("%d%d%d",&opt,&l,&r);
if(opt==)
change(,l,r);
else if(opt==)
printf("%d\n",ask(,l,r));
}
return ;
}

最新文章

  1. ZeroMQ接口函数之 :zmq_send_const – 从一个socket上发送一个固定内存数据
  2. dom4j的读写xml文件,读写xml字符串
  3. linux挂载共享文件夹
  4. UltraEdit20 注册
  5. 开源项目ets_cache分析
  6. iOS 关闭自动锁屏
  7. React学习笔记(二) 组件状态
  8. Python:文件操作
  9. Chapter 6 — Improving ASP.NET Performance
  10. USACO Section 5.4 TeleCowmunication(最小割)
  11. jAVA 得到Map价值
  12. linux command ---1
  13. js五种设计模式说明与示例
  14. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ HTTP请求
  15. TCP三次握手机制中的seq和ack
  16. Android版数据结构与算法(二):基于数组的实现ArrayList源码彻底分析
  17. 以Windows服务方式运行.NET Core程序
  18. 切换JDK版本时修改JAVA_HOME环境变量不生效(转)
  19. POJ 2001 Shortest Prefixes(字典树)
  20. Curator之Recipes之锁

热门文章

  1. 【转载】VS工具使用&mdash;&mdash;代码图
  2. HDU 2018 母牛的故事 [补]
  3. Java小日历
  4. putty software caused connection abort
  5. MRUnit测试
  6. Java中的final具体解释以及用途实战
  7. 20170223-问题001,增强中的E消息 显示为 S模式消息,
  8. Java中需要了解的点
  9. JVM内存分配策略、各个代区、FullGC/MinorGC
  10. CentOS 7.2 安装Gerrit 2.14.6