题目描述

\(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\)

思路:这是一道跟洛谷\(P2574\)思路类似的一道题目,唯一不同的就是这道题需要建树,因为初始值不都是\(0\),然后对于此题,区间修改操作就是区间异或运算,区间查询就是查询区间中\(1\)的个数,然后用线段树维护区间中\(1\)的个数即可。

代码:

  1. #include<cstdio>
  2. #include<cctype>
  3. #define maxn 200007
  4. #define ls rt<<1
  5. #define rs rt<<1|1
  6. using namespace std;
  7. int n,m,sum[maxn<<2],lazy[maxn<<2];
  8. inline int qread() {
  9. char c=getchar();int num=0,f=1;
  10. for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
  11. for(;isdigit(c);c=getchar()) num=num*10+c-'0';
  12. return num*f;
  13. }
  14. inline void pushup(int rt) {
  15. sum[rt]=sum[ls]+sum[rs];
  16. }
  17. void build(int rt, int l, int r) {
  18. if(l==r) {
  19. scanf("%1d",&sum[rt]);
  20. return;
  21. }
  22. int mid=(l+r)>>1;
  23. build(ls,l,mid);
  24. build(rs,mid+1,r);
  25. pushup(rt);
  26. }
  27. inline void pushdown(int rt, int len) {
  28. if(lazy[rt]) {
  29. lazy[ls]^=1;
  30. lazy[rs]^=1;
  31. sum[ls]=(len-(len>>1))-sum[ls];
  32. sum[rs]=(len>>1)-sum[rs];
  33. lazy[rt]=0;
  34. }
  35. }
  36. void modify(int rt, int l, int r, int L, int R) {
  37. if(L>r||R<l) return;
  38. if(L<=l&&r<=R) {
  39. lazy[rt]^=1;
  40. sum[rt]=r-l+1-sum[rt];
  41. return;
  42. }
  43. pushdown(rt,r-l+1);
  44. int mid=(l+r)>>1;
  45. modify(ls,l,mid,L,R),modify(rs,mid+1,r,L,R);
  46. pushup(rt);
  47. }
  48. int csum(int rt, int l, int r, int L, int R) {
  49. if(L>r||R<l) return 0;
  50. if(L<=l&&r<=R) return sum[rt];
  51. pushdown(rt,r-l+1);
  52. int mid=(l+r)>>1;
  53. return csum(ls,l,mid,L,R)+csum(rs,mid+1,r,L,R);
  54. }
  55. int main() {
  56. n=qread(),m=qread();
  57. build(1,1,n);
  58. for(int i=1,k,l,r;i<=m;++i) {
  59. k=qread(),l=qread(),r=qread();
  60. if(!k) modify(1,1,n,l,r);
  61. else printf("%d\n",csum(1,1,n,l,r));
  62. }
  63. return 0;
  64. }

洛谷P2574 XOR的艺术的更多相关文章

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

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

  2. 洛谷——P2574 XOR的艺术

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

  3. 洛谷 P2574 XOR的艺术

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

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

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

  5. 洛谷 2574 XOR的艺术

    [题解] 线段树维护区间中1的个数就好了.每次修改就打上标记并把区间的sum改为len-sum. #include<cstdio> #include<algorithm> #i ...

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

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

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

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

  8. 【洛谷P2574】XOR的艺术

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

  9. P2574 XOR的艺术

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

随机推荐

  1. Java 对象引用以及对象赋值

    一.Vehicle veh1 = new Vehicle(); 通常这条语句执行的动作被称为创建一个对象,其实他包含了四个动作. 1.new Vehicle  :表示在堆空间内创建了一个Vehicle ...

  2. BZOJ5324 JXOI2018 守卫

    传送门 这是我见过的为数不多的良心九怜题之一 题目大意 给定一段$n$个点构成的折线,第$i$个折点的坐标是$(i,h_i)$,你可以在$i$点放置一个视野,定义$i$能看到$j$当且仅当$i$处有视 ...

  3. 洛谷P2878 [USACO07JAN]保护花朵Protecting the Flowers

    题目描述 Farmer John went to cut some wood and left N (2 ≤ N ≤ 100,000) cows eating the grass, as usual. ...

  4. POJ2785(upper_bound)

    #include"cstdio" #include"algorithm" using namespace std; ; int A[MAXN],B[MAXN], ...

  5. Java中“分号”引起的陷阱

    对于这类问题而言,难度不大,多半是由于我们有误操作引起的.但在查找问题所在的时候我们有可能需要花费一番功夫了. 实例一: package com.yonyou.test; /** * 测试类 * @a ...

  6. windows 创建和调用 动态库,静态库

    windows创建和调用静态库 // MathFuncsLib.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b ...

  7. 转载:oracle用户创建及权限设置

    权限: create session create table unlimited tablespace connect resource dba 例: #sqlplus /nolog SQL> ...

  8. C#设计模式(12)——享元模式

    一.概念 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直 ...

  9. ueditor1.4.3jsp版在上传图片报"未找到上传文件"解决方案

    这是因为struts2的过滤器,解决方法是自定义一个过滤器 新建一个过滤器的类,代码: package com.filter; import java.io.IOException; import j ...

  10. 你做电商死法TOP10:你中了几枪?

    有相关报道说淘宝目前只有3%的店铺能够盈利,其余97%的店铺基本上都成了炮灰.这是一个非常可怕的数字,都说不赚钱的电商是犯罪,那么,是什么原因导致了会有如此庞大的电商群体一如既往的走在这千军万马的不归 ...