题目传送门

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


开始想的是分别维护区间内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 ;
}

LuoguP2846[USACO08NOV]光开关Light Switching【线段树维护区间异或】By cellur925的更多相关文章

  1. 洛谷P2826 [USACO08NOV]光开关Light Switching [2017年6月计划 线段树02]

    P2826 [USACO08NOV]光开关Light Switching 题目描述 Farmer John tries to keep the cows sharp by letting them p ...

  2. 洛谷——P2846 [USACO08NOV]光开关Light Switching

    P2846 [USACO08NOV]光开关Light Switching 题目大意: 灯是由高科技——外星人鼠标操控的.你只要左击两个灯所连的鼠标, 这两个灯,以及之间的灯都会由暗变亮,或由亮变暗.右 ...

  3. P2846 [USACO08NOV]光开关Light Switching

    题目描述 Farmer John tries to keep the cows sharp by letting them play with intellectual toys. One of th ...

  4. POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 )

    POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 ) 题意分析 给出n个点,m个询问,和当前位置pos. 先给出n-1条边,u->v以及边权w. 然后有m个询问 ...

  5. Can you answer these queries V SPOJ - GSS5 (分类讨论+线段树维护区间最大子段和)

    recursion有一个整数序列a[n].现在recursion有m次询问,每次她想知道Max { A[i]+A[i+1]+...+A[j] ; x1 <= i <= y1 , x2 &l ...

  6. 线段树维护区间前k小

    线段树维护区间前k小 $ solution: $ 觉得超级钢琴太麻烦?在这里线段树提供一条龙服务 . 咳咳,开始讲正题!这道题我们有一个和超级钢琴复杂度一样 $ ~O(~\sum x\times lo ...

  7. CodeForces - 587E[线段树+线性基+差分] ->(线段树维护区间合并线性基)

    题意:给你一个数组,有两种操作,一种区间xor一个值,一个是查询区间xor的结果的种类数 做法一:对于一个给定的区间,我们可以通过求解线性基的方式求出结果的种类数,而现在只不过将其放在线树上维护区间线 ...

  8. hdu_5726_GCD(线段树维护区间+预处理)

    题目链接:hdu_5726_GCD 题意: 给你n个数(n<=1e5)然后m个询问(m<=1e5),每个询问一个区间,问你这个区间的GCD是多少,并且输出从1到n有多少个区间的GCD和这个 ...

  9. FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解

    题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和.我们设出两个变量Lmin,Rmin,Mmin表示区 ...

随机推荐

  1. centos下的hadoop服务器的配置

    是我安装CentOS服务器的过程,记录下来,与大家一起分享. 安装操作系统 CentOS 6.2 ,CentOS-6.2-i386-bin-DVD1.iso(32位) ,CentOS-6.2-x86_ ...

  2. vs2017 使用GitHub 推送到远程仓储

    vs2017下使用github拓展工具无法成功推送,提示“未能推送到远程存储库” 窗口错误显示:发布到远程存储库时遇到错误: Git failed with a fatal error. HttpRe ...

  3. 【linux驱动分析】之dm9000驱动分析(三):sk_buff结构分析

    [linux驱动分析]之dm9000驱动分析(一):dm9000原理及硬件分析 [linux驱动分析]之dm9000驱动分析(二):定义在板文件里的资源和设备以及几个宏 [linux驱动分析]之dm9 ...

  4. JavaScript 的 MVP 框架 Riot.js

    Riot.js 详细介绍 Riot.js是一个客户端模型-视图-呈现(MVP)框架并且它非常轻量级甚至小于1kb.尽管他的大小令人难以置信,所有它能构建的有如下:一个模板引擎,路由,甚至是库和一个严格 ...

  5. 浅谈JavaScript的函数表达式(递归)

    递归函数,在前面的博客中已经简单的介绍了.递归函数是一个通过函数名称在函数内部调用自身的函数.如下: function fac(num){ if(num<1){ return 1; } else ...

  6. 前端遇上Go: 静态资源增量更新的新实践

    前端遇上Go: 静态资源增量更新的新实践https://mp.weixin.qq.com/s/hCqQW1F8FngPPGZAisAWUg 前端遇上Go: 静态资源增量更新的新实践 原创: 洋河 美团 ...

  7. linux shell 突破

    targetDate=$(cat maxdayid); targartMonth=${targetDate::}; targartYear=${targetDate::}; echo $targart ...

  8. IDHTTP用法详解 good

    一.IDHTTP的基本用法 IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快.更节约资源,缺点是需要手动维护cook,连接等 IDHttp的创建,需要引入ID ...

  9. (C)理解#define write(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))

      理解 #define write(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b)) 嵌入式系统编程,要求程序员能够利用C语言访问固 ...

  10. vue开发:移动端图片上传

    因为最近遇到个移动端上传头像的需求,上传到后台的数据是base64位,其中为了提高用户体验,把比较大的图片用canvas进行压缩之后再进行上传.在移动端调用拍照功能时,会发生图片旋转,为了解决这个问题 ...