刚刚学了,线段树,一道线段树入门题试试水

下面是题面

题目描述

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]的伤害

  • 输出格式:

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

输入输出样例

  • 输入样例

10 6

1011101001

0 2 4

1 1 5

0 3 7

1 1 10

0 1 4

1 2 6

  • 输出样例

3

6

1

读完题,题意就很明显了,明显是一道线段树的题,线段树的题嘛,关键一般就在pushup和pushdown上,既然是异或1,那么第二次异或也就相当于没有异或,同理奇数次异或则变,偶数次异或不变

下放代码

#include<iostream>
#include<cstdio>
#include<cctype>
#define ll long long
#define maxn 200005
#define gc() getchar()
using namespace std;
int n,m;
char a[maxn]; inline ll read(){
ll a=0;int f=1;char p=gc();
while(!isdigit(p)){f|=(p=='-');p=gc();}
while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
return a*f;
} #define lc p<<1 //左儿子
#define rc p<<1|1 //右儿子
struct ahaha{
ll v,lz; //v存答案,lz为懒惰标记
}t[maxn<<2]; //开四倍大小,防越界
inline void pushup(int p){ //pushup依旧简单
t[p].v=t[lc].v+t[rc].v;
}
inline void pushdown(int p,int l,int r){
if(!t[p].lz)return;
int m=l+r>>1;
t[lc].v=m-l+1-t[lc].v; //0变1,1变0,也就是长度减去它本身
t[rc].v=r-m-t[rc].v;
t[lc].lz^=1;t[rc].lz^=1;
t[p].lz=0;
}
void build(int p,int l,int r){
if(l==r){t[p].v=(a[l]^48);return;}
int m=l+r>>1;
build(lc,l,m);build(rc,m+1,r);
pushup(p);
}
void update(int p,int l,int r,int L,int R){
if(l>R||r<L)return;
if(L<=l&&r<=R){t[p].v=r-l+1-t[p].v;t[p].lz^=1;return;} //同理,异或后长度减本身
int m=l+r>>1;pushdown(p,l,r);
update(lc,l,m,L,R);update(rc,m+1,r,L,R);
pushup(p);
}
ll query(int p,int l,int r,int L,int R){
if(l>R||r<L)return 0;
if(L<=l&&r<=R)return t[p].v;
int m=l+r>>1;pushdown(p,l,r);
return query(lc,l,m,L,R)+query(rc,m+1,r,L,R);
} inline void solve_1(){
int x=read(),y=read();
update(1,1,n,x,y);
}
inline void solve_2(){
int x=read(),y=read();
printf("%lld\n",query(1,1,n,x,y));
} int main(){
n=read();m=read();
scanf("%s",a + 1);
build(1,1,n);
for(int i=1;i<=m;++i){
int zz=read();
switch(zz){
case 0:solve_1();break;
case 1:solve_2();break;
}
}
return 0;
}

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

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

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

  2. 洛谷P2574 XOR的艺术

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

  3. 洛谷——P2574 XOR的艺术

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

  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. 1563: [NOI2009]诗人小G

    1563: [NOI2009]诗人小G https://lydsy.com/JudgeOnline/problem.php?id=1563 分析: 直接转移f[i]=f[j]+cost(i,j),co ...

  2. bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统)

    bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统) cogs zoj bzoj-权限 题解 bzoj和zoj都是骗访问量的233,我没有 ...

  3. [转]资深CTO:关于技术团队打造与管理的10问10答

    一.你如何衡量软件工程师个人的工作表现?如何衡量整个工程师团队的工作表现? 主要从两方面: 这个员工做的工作是不是他同意做的或者应该做的?(What) 他们是如何完成自己的工作的?(How) 任何绩效 ...

  4. SQL基本的45题

    -- 查询Student表中的所有记录的Sname.Ssex和Class列.SELECT Sname,Ssex,Class from student -- 查询教师所有的单位即不重复的Depart列. ...

  5. 「日常训练」Jongmah(Codeforces-1110D)

    题意 你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 分析 根据官方Editori ...

  6. charles基本使用文档

    Charles 主要的功能包括: 截取 Http 和 Https 网络封包. 支持重发网络请求,方便后端调试. 支持修改网络请求参数. 支持网络请求的截获并动态修改. 支持模拟慢速网络. Charle ...

  7. 三、Django之请求与响应-Part 1

    一.新建项目 进入你指定的项目保存目录,然后运行下面的命令: $ django-admin startproject mysite 这将在目录下生成一个mysite目录,也就是你的这个Django项目 ...

  8. Redis 哨兵 Sentinel

    Redis Sentinel:redis集群应用,分布式系统.   多个Sentinal进程之间通过 gossip 协议来接收主服务器是否下线的信息,通过 Raft 一致性协议来决定故障转移及转移服务 ...

  9. leetcode13_C++罗马数字转整数

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并 ...

  10. 获取label标签内for的属性值-js

    <body> <div class="row_2" id="ass"> <label for="aaa"> ...