题目描述

AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏。在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下

1、 拥有一个伤害串为长度为n的01串。

2、 给定一个范围[l,r],伤害为伤害串的这个范围内中1的个数

3、 会被随机修改伤害串中的数值,修改的方法是把[l,r]中的所有数xor上1

AKN想知道一些时刻的伤害,请你帮助他求出这个伤害

输入输出格式

输入格式:

第一行两个数n,m,表示长度为n的01串,有m个时刻

第二行一个长度为n的01串,为初始伤害串

第三行开始m行,每行三个数p,l,r

若p为0,则表示当前时刻改变[l,r]的伤害串,改变规则如上

若p为1,则表示当前时刻AKN想知道[l,r]的伤害

输出格式:

对于每次询问伤害,输出一个数值伤害,每次询问输出一行

输入输出样例

输入样例#1:

  1. 10 6
  2. 1011101001
  3. 0 2 4
  4. 1 1 5
  5. 0 3 7
  6. 1 1 10
  7. 0 1 4
  8. 1 2 6
输出样例#1:

  1. 3
  2. 6
  3. 1

说明

样例解释:

1011101001

1100101001

询问[1,5]输出3

1111010001

询问[1,10]输出6

0000010001

询问[2,6]输出1

数据范围:

10%数据2≤n,m≤10

另有30%数据2≤n,m≤2000

100%数据2≤n,m≤2*10^5

By:worcher

思路

线段树(带一下flag标记)

代码实现

  1. #include<cstdio>
  2. const int maxn=1e6;
  3. const int maxl=1e6;
  4. inline int min_(int x,int y){return x<y?x:y;}
  5. inline int max_(int x,int y){return x>y?x:y;}
  6. int n,m,l;
  7. int a,b,c;
  8. char ch[maxl];
  9. struct nate{int l,r,s,flag;}t[maxn];
  10. void build(int k,int l,int r){
  11. t[k].l=l,t[k].r=r;
  12. if(l==r){
  13. t[k].s=ch[l-]==''?:;
  14. return;
  15. }
  16. int mid=l+r>>,ls=k<<,rs=ls+;
  17. build(ls,l,mid);
  18. build(rs,mid+,r);
  19. t[k].s=t[ls].s+t[rs].s;
  20. }
  21. void down(int k){
  22. int ls=k<<,rs=ls+;
  23. t[ls].s=(t[ls].r-t[ls].l+)-t[ls].s;
  24. t[rs].s=(t[rs].r-t[rs].l+)-t[rs].s;
  25. t[ls].flag^=,t[rs].flag^=,t[k].flag^=;;
  26. }
  27. int sum(int k,int l,int r,int al,int ar){
  28. if(l==al&&r==ar) return t[k].s;
  29. if(t[k].flag) down(k);
  30. int ret=,mid=l+r>>,ls=k<<,rs=ls+;
  31. if(al<=mid) ret+=sum(ls,l,mid,al,min_(ar,mid));
  32. if(ar>mid) ret+=sum(rs,mid+,r,max_(al,mid+),ar);
  33. return ret;
  34. }
  35. void change(int k,int l,int r,int al,int ar){
  36. if(l==al&&r==ar){
  37. t[k].s=(t[k].r-t[k].l+)-t[k].s;
  38. t[k].flag^=;
  39. return;
  40. }
  41. if(t[k].flag) down(k);
  42. int ret=,mid=l+r>>,ls=k<<,rs=ls+;
  43. if(al<=mid) change(ls,l,mid,al,min_(ar,mid));
  44. if(ar>mid) change(rs,mid+,r,max_(al,mid+),ar);
  45. t[k].s=t[ls].s+t[rs].s;
  46. }
  47. int main(){
  48. scanf("%d%d",&n,&m);
  49. scanf("%s",ch);
  50. build(,,n);
  51. for(int i=;i<=m;i++){
  52. scanf("%d%d%d",&a,&b,&c);
  53. if(a) printf("%d\n",sum(,,n,b,c));
  54. else change(,,n,b,c);
  55. }
  56. return ;
  57. }

XOR的艺术的更多相关文章

  1. 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)

    To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...

  2. 【洛谷】【线段树+位运算】P2574 XOR的艺术

    [题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...

  3. 【洛谷P2574】XOR的艺术

    XOR的艺术 题目链接 用线段树维护sum, 修改时 tag[p]^=1; sum=r-l+1-sum; 详见代码 #include<iostream> #include<cstdi ...

  4. luogu P2574 XOR的艺术 (线段树)

    luogu P2574 XOR的艺术 (线段树) 算是比较简单的线段树. 当区间修改时.\(1 xor 1 = 0,0 xor 1 = 1\)所以就是区间元素个数减去以前的\(1\)的个数就是现在\( ...

  5. 洛谷——P2574 XOR的艺术

    P2574 XOR的艺术 很久之前就想挑战一下这道题了,线段树下传标记的入门题,跟区间加法下传标记类似. #include<bits/stdc++.h> #define N 1000005 ...

  6. 洛谷 P2574 XOR的艺术

    刚刚学了,线段树,一道线段树入门题试试水 下面是题面 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个 ...

  7. P2574 XOR的艺术

    题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[l,r ...

  8. 洛谷P2574 XOR的艺术

    题目描述 \(AKN\)觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为\(n\)的\(01\)串. 2 ...

  9. 洛谷P2574 XOR的艺术(线段树)——Chemist

    当线段树遇上无敌位运算! 还是老套路,线段树维护区间和,一个区间有几个"1"就是这个区间的区间和,同时支持区间修改区间查询,只不过操作从加法变成了异或.主要难点就在更新懒标记那里, ...

随机推荐

  1. 如何保证access_token长期有效--微信公众平台开发

    http://blog.csdn.net/qq_33556185/article/details/52758781 import javax.servlet.ServletContext; impor ...

  2. java性能优化读书笔记(1)

    1.采用clone()方式创建对象 java语言里面的所有类都默认继承自java.lang.Object,此类里有一个clone()方法: 拷贝对象返回的是一个新的对象,而不是一个对象的引用地址: 拷 ...

  3. RabbitMQ二:AMQP协议

    参考这个:http://kb.cnblogs.com/page/73759/ 参考这个:http://www.cnblogs.com/charlesblc/p/6286875.html 写的挺好 Ra ...

  4. [ CodeForces 1063 A ] Oh Those Palindromes

    \(\\\) \(Description\) 给出 \(N\) 个小写字母,将他们排成一个字符串,使得这个字符串里包含的回文串最多. \(N\le 10^5\) \(\\\) \(Solution\) ...

  5. 在struct 中使用string,赋值会报错

    struct中最好使用char来代替string,因为string的大小不是固定的

  6. dede其他栏目页的logo没有完整显示怎么办?

    在首页完全没有问题,可是点击关于我们.联系我们.加入我们的时候logo图标是缺失的,这时候怎么办? 其实这个是css样式的问题,只要找到相对应页面的css,改一下他们的宽就可以了,如果高不够就自己调整 ...

  7. 系统信号-signal.h

    #define SIGSEGV 11 /* segmentation violation */ #define SIGSYS 12 /* bad argument to system call */ ...

  8. 14Oracle Database 高级事务,游标

    Oracle Database 高级事务,游标 隔离级别 脏读 不可重复读 虚读 读未提交 Read uncommitted 可以 可以 可以 读已提交 Read committed 不可以 可以 可 ...

  9. svn无法显示日期和作者

    当遇到这种情况,只要把这个read改为none就可以显示了  亲测绝对管用

  10. Xcode编译ffmpeg(2)

    iOS: FFmpeg编译和使用问题总结 折磨了我近一周多时间的FFmpeg库编译问题终于解决了,必须得把这一段时间来遇到过的坑全写出来.如果急着解决问题,编译最新版本的FFmpeg库请直接看第二部分 ...