题目描述

有一个 n 个元素的数组,每个元素初始均为 0。有 m 条指令,要么让其中一段连续序列数字反转——0 变 1,1 变 0(操作 1),要么询问某个元素的值(操作 2)。 例如当 n = 20 时,10 条指令如下:

输入输出格式

输入格式:

第一行包含两个整数 n, m,表示数组的长度和指令的条数; 以下 m 行,每行的第一个数 t 表示操作的种类:

若 t = 1,则接下来有两个数 L, R,表示区间 [L, R] 的每个数均反转; 若 t = 2,则接下来只有一个数 i,表示询问的下标。

输出格式:

每个操作 2 输出一行(非 0 即 1),表示每次操作 2 的回答。

输入输出样例

输入样例#1:

20 10
1 1 10
2 6
2 12
1 5 12
2 6
2 15
1 6 16
1 11 17
2 12
2 6
输出样例#1:

1
0
0
0
1
1

说明

对于 50% 的数据,1 ≤ n ≤ 10^3, 1 ≤ m ≤ 10^4; 对于 100% 的数据,1 ≤ n ≤ 10^5, 1 ≤ m ≤ 5 × 10^5,保证 L ≤ R。

线段树的区间修改,单点查询,似乎并不用建树,建树好像还有问题

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
int xxoo[maxn];
int n,m,L,R,opt,x;
void pushdown(int now)
{
if(xxoo[now])
{
xxoo[now*]^=;
xxoo[now*+]^=;
xxoo[now]=;
}
}
void modify(int now,int l,int r,int stdl,int stdr)
{
if(stdl>=l&&stdr<=r)
{
xxoo[now]^=;
return;
}
pushdown(now);
int mid=(stdl+stdr)>>;
if(l<=mid)
{
modify(now<<,l,r,stdl,mid);
}
if(r>mid)
{
modify(now<<|,l,r,mid+,stdr);
}
}
int query(int now,int x,int stdl,int stdr)
{
if(stdl==stdr)
{
return xxoo[now];
}
pushdown(now);
int mid=(stdl+stdr)>>;
if(x<=mid)
{
return query(now<<,x,stdl,mid);
}
else
{
return query(now<<|,x,mid+,stdr);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d",&opt);
if(opt==)
{
scanf("%d%d",&L,&R);
modify(,L,R,,n);
}
else
{
scanf("%d",&x);
printf("%d\n",query(,x,,n));
}
}
return ;
}

错误代码(多了一个建树)

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
struct node
{
int l;
int r;
int lazyxor;
int value;
int sum;
}tree[maxn*];
int n,m,L,R,opt,x;
void build(int now,int l,int r)
{
tree[now].l=l;
tree[now].r=r;
tree[now].lazyxor=;
if(l==r)
{
tree[now].value=tree[now].sum=;
return;
}
int mid=(l+r)>>;
build(now<<,l,mid);
build(now<<|,mid+,r);
tree[now].sum=tree[now*].sum+tree[now*+].sum;
}
void pushdown(int now)
{
if(tree[now].lazyxor)
{
tree[now*].lazyxor^=;
tree[now*+].lazyxor^=;
tree[now].lazyxor=;
}
}
void modify(int now,int l,int r)
{
if(tree[now].l>=l&&tree[now].r<=r)
{
tree[now].lazyxor^=;
return;
}
pushdown(now);
int mid=(tree[now].l+tree[now].r)>>;
if(l<=mid)
{
modify(now<<,l,mid);
}
if(r>mid)
{
modify(now<<|,mid+,r);
}
}
int query(int now,int x,int l,int r)
{
if(tree[now].l==tree[now].r)
{
return tree[now].lazyxor;
}
pushdown(now);
int mid=(tree[now].l+tree[now].r)>>;
if(x<=mid)
{
return query(now*,x,l,r);
}
else
{
return query(now*+,x,l,r);
}
}
int main()
{
scanf("%d%d",&n,&m);
build(,,n);
for(int i=;i<=m;i++)
{
scanf("%d",&opt);
if(opt==)
{
scanf("%d%d",&L,&R);
modify(,L,R);
}
else
{
scanf("%d",&x);
printf("%d\n",query(,x,,n));
}
}
return ;
}

P5057 [CQOI2006]简单题的更多相关文章

  1. 洛谷 P5057 [CQOI2006]简单题 题解

    P5057 [CQOI2006]简单题 题目描述 有一个 n 个元素的数组,每个元素初始均为 0.有 m 条指令,要么让其中一段连续序列数字反转--0 变 1,1 变 0(操作 1),要么询问某个元素 ...

  2. P5057 [CQOI2006]简单题(线段树)

    果然简单题,5分钟紫题++ 代码 #include <cstdio> #include <algorithm> #include <cstring> using n ...

  3. 洛谷P5057 [CQOI2006]简单题(线段树)

    题意 题目链接 Sol 紫色的线段树板子题??... #include<iostream> #include<cstdio> #include<cmath> usi ...

  4. 洛谷 P5057 [CQOI2006]简单题(树状数组)

    嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...

  5. 洛谷 P5057 [CQOI2006]简单题 (树状数组,位运算)

    题意:有一个长度为\(n\)的数组,进行\(m\)次操作,每次读入一个值\(t\),如果\(t=1\),则将区间\([l,r]\)的数字反转,若\(t=2\),则查询下标为\(i\)的值. 题解:树状 ...

  6. [洛谷P5057][CQOI2006]简单题

    题目大意:有一个长度为$n$的$01$串,两个操作: $1\;l\;r:$把区间$[l,r]$翻转($0->1,1->0$) $2\;p:$求第$p$位是什么 题解:维护前缀异或和,树状数 ...

  7. P5057 [CQOI2006]简单题 前缀异或差分/树状数组

    好思路,好思路... 思路:前缀异或差分 提交:1次 题解:区间修改,单点查询,树状数组,如思路$qwq$ #include<cstdio> #include<iostream> ...

  8. P5057 【[CQOI2006]简单题】

    洛谷P5057[CQOI2006]简单题 差分 树状数组基本操作不说了,主要想记录一下异或下的差分 a数组为每一位的真实值(假设\(a[0]=0\)),t为差分后的数组 则\(t[i]=a[i]\)^ ...

  9. 「CQOI2006」简单题 线段树

    「CQOI2006」简单题 线段树 水.区间修改,单点查询.用线段树维护区间\([L,R]\)内的所有\(1\)的个数,懒标记表示为当前区间是否需要反转(相对于区间当前状态),下方标记时懒标记取反即可 ...

随机推荐

  1. apriori && fpgrowth:频繁模式与关联规则挖掘

    已迁移到我新博客,阅读体验更佳apriori && fpgrowth:频繁模式与关联规则挖掘 详细代码我放在github上:click me 一.实验说明 1.1 任务描述 1.2 数 ...

  2. Python:bs4中 string 属性和 text 属性的区别及背后的原理

    刚开始接触 bs4 的时候,我也很迷茫,觉得 string 属性和 text 属性是一样的,不明白为什么要分成两个属性. html = '<p>hello world</p>' ...

  3. 使用LR编写windows sockets协议xml报文格式脚本实战

    以下是测试脚本Demo: #include "lrs.h" Action() { char * resultCode;//结果代码 char * time; //系统时间 char ...

  4. 利用 Blob 处理 node 层返回的二进制文件流字符串并下载文件

    博客地址:https://ainyi.com/65 解释 | 背景 看到标题有点懵逼,哈哈,实际上是后端将文件处理成二进制流,返回到前端,前端处理这个二进制字符串,输出文件或下载 最近公司有个需求是用 ...

  5. 玩玩小程序:使用 WebApi 交互打造原生的微信小程序 - 图灵小书架

    使用 WebApi 交互打造原生的微信小程序 - 图灵小书架 目录 介绍 源码地址 扫一扫体验 代码分析 其它相关信息(互联网搜集) 介绍 定时抓取图灵社区官网的首页.最热.推荐和最新等栏目的相关图书 ...

  6. IT技术团队管理之成长

    ------------------------------------------------------------------ 今天先到这儿,希望对您技术领导力, 企业管理,系统架构设计与评估, ...

  7. 【学习笔记】分布式Tensorflow

    目录 分布式原理 单机多卡 多机多卡(分布式) 分布式的架构 节点之间的关系 分布式的模式 数据并行 同步更新和异步更新 分布式API 分布式案例 Tensorflow的一个特色就是分布式计算.分布式 ...

  8. dubbo-源码分析Provider

    Dubbo provider启动原理: 当我们的dubbo启动我们的spring容器时spring 初始化容器的时候会查找META-INF/spring.handles文件查找对应的Namespace ...

  9. 3.JavaScript-语法、关键保留字及变量

    语法构成区分大小写标识符注释直接量字面量literal关键字保留字变量语法构成JavaScript 的语言核心 ECMAScript. 区分大小写ECMAScript 中的一切,包括变量.函数名和操作 ...

  10. Vue基础知识

    Vue特性: 双向数据绑定 通过 指令 扩展了 HTML,通过 表达式 绑定数据到 HTML 解耦视图与数据 可复用组件 虚拟DOM -> 对象 M-V-VM 数据驱动视图 Vue声明周期: b ...