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

下面是题面

题目描述

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. 北京Uber优步司机奖励政策(4月10日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. C#之#if #endif的简单用法

    有时候我们看到别人的代码中有#if #endif,其实这是通过不同版本来选择运行哪段代码,和咱们的if,else是一样的.下面看下简单的用法 #if DEBUG txt_display.Text = ...

  3. 一步步带你配置IIS(包括错误分析)

    今天趁着工作中的问题一下子来解决IIS配置 发布网站:点击VS发布网站 第一步:新建配置文件(我取名为webSite) : 第二步:选择发布方法并且选择把文件发布到哪里(比喻在D盘创建一个文件夹web ...

  4. VirtualBox主机和虚拟机互相通信

    默认情况下VirtualBox虚拟机网络设置为网络地址转换,虚拟机中的地址一般是10.0.2.x,虚拟机中访问主机只需要访问默认网关地址即可,但是主机访问虚拟机就需要增加一些配置了,方法有以下几种: ...

  5. DataGridView滚动慢​的解决方法

    当DataGridView达到一定大小的时候,拖动滚动条就会非常慢,出现让人难以忍受的闪动. 即便只有100行,每行30列. 解决方法是启用DataGridView的双缓冲. 1 2 3 4 5 6 ...

  6. sql 命令使用简单记录

    半个月前就想记下用过的SQL命令的!!!     主题: 按时间查询: https://blog.csdn.net/hejpyes/article/details/41863349   左关联: se ...

  7. 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型

    人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...

  8. Python爬虫下载Bilibili番剧弹幕

    本文绍如何利用python爬虫下载bilibili番剧弹幕. 准备: python3环境 需要安装BeautifulSoup,selenium包 phantomjs 原理: 通过aid下载bilibi ...

  9. 性能度量RMSE

    回归问题的典型性能度量是均方根误差(RMSE:Root Mean Square Error).如下公式. m为是你计算RMSE的数据集中instance的数量. x(i)是第i个实例的特征值向量 ,y ...

  10. python基础-02-while格式化逻辑运算

    python其他知识目录 1.循环打印“我是小马过河” while True:    print('我是小马过河') #4.用while从一打印到10 #5.请通过循环,1 2 3 4 5 6 8 9 ...