嗯...

题目链接:https://www.luogu.org/problem/P5057

首先发现这道题中只有0和1,所以肯定与二进制有关。然后发现这道题需要支持区间更改和单点查询操作,所以首先想到的是异或意义下的差分数组,于是自己便写了一个差分数组,确实好写,但很慢(可能我写的不优),下面是五十分的异或意义下的差分的代码:

 #include<cstdio>
#include<iostream> using namespace std; int a[], b[]; int main(){
int n, m, t, l, r, x;
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) b[i] = a[i] ^ a[i - ];
for(int i = ; i <= m; i++){
scanf("%d", &t);
if(t == ){
scanf("%d%d", &l, &r);
b[l] ^= ;
b[r + ] ^= ;
for(int i = ; i <= n; i++)
a[i] = a[i - ] ^ b[i];
}
else{
scanf("%d", &x);
printf("%d\n", a[x]);
}
}
return ;
}

50分-差分

很明显,我写的差分时间复杂度在O(mn)左右,所以超时...

而正解是用树状数组来维护,因为树状数组支持区间更改和单点查询。注意单点查询之后,也是本题最神奇的地方,将查询的10进制%2,即可得它的二进制的最后一位即为答案(也可以理解为进行奇数次操作会改变,进行偶数次操作不会改变)

AC代码:

#include<cstdio>
#include<iostream> using namespace std; int n, t[]; inline int lowbit(int x){
return x & -x;
}//lowbit inline void change(int x, int k){
while(x <= n){
t[x] += k;
x += lowbit(x);
}
return;
}//区间更改 inline int check(int x){
int ans = ;
while(x > ){
ans += t[x];
x -= lowbit(x);
}
return ans;
}//单点查询 int main(){
int m, l, r, f, d;
scanf("%d%d", &n, &m);
for(int i = ; i <= m; i++){
scanf("%d", &f);
if(f == ){
scanf("%d%d", &l, &r);
change(l, );
change(r + , -);
}
else{
scanf("%d", &d);
printf("%d\n", check(d) % );//核心
}
}
return ;
}

AC代码

洛谷 P5057 [CQOI2006]简单题(树状数组)的更多相关文章

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

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

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

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

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

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

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

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

  5. [洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?

    其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客 Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数 ...

  6. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

  7. 洛谷P3368 【模板】树状数组 2

    P3368 [模板]树状数组 2 102通过 206提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 如题,已知一个数列,你需要进行下面两 ...

  8. 洛谷P3374 【模板】树状数组 1

    P3374 [模板]树状数组 1 140通过 232提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 题目描述有误 题目描述 如题,已知一个数列,你需要进行下面两 ...

  9. 洛谷 P3368 【模板】树状数组 2

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

随机推荐

  1. C语言数据结构——第一章 数据结构的概念

    一.数据结构的基本概念 1.1-数据结构是什么? 数据结构是计算机存储和组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.一般情况下,精心选择的数据结构可以带来更高的运行或者 ...

  2. 如何在linux安装ruby2.2.2+

    背景: 想搭建redis集群但是提示需要ruby2.2.2+ 直接使用yum安装 yum -y install ruby ruby-devel rubygems rpm-build 使用ruby -v ...

  3. POJ2909_Goldbach's Conjecture(线性欧拉筛)

    Goldbach's Conjecture: For any even number n greater than or equal to 4, there exists at least one p ...

  4. Docker镜像加速,设置国内源

    源地址设置 在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件) { "registry-mirrors": [ "https ...

  5. 安装rpm包时提示错误:依赖检测失败的解决方法

    安装rpm包时提示错误:依赖检测失败 解决方法: 命令末尾加上--nodeps --force

  6. JS数组删除

    --------------let items=['a','1',0,2,100,null,NaN,undefined,]; -------------要求以上数据执行后输出['1',0,2,100] ...

  7. nginx反向代理配置及常见指令

    nginx配置文件: /usr/local/nginx1.16.1/conf/nginx.conf nginx.conf默认的server配置: server{ listen 80; server_n ...

  8. celery task - 2

    # celery task 前言 讨论一个定时任务,一般而言,需要的功能如下: 封装成对象,独立执行: 对象有一些接口,便于了解它的状态: 定时调用: 行为控制,包括重试,成功/失败回调等: 下面分别 ...

  9. python中的坎坷之函数、集合

    函数 作用:实现一个功能,函数理解成一个工具,遇到问题把这个工具拿来用 优点:函数更方便,复用,可以在多个场景下用 1.带参数的函数 name='lzs-nice' nane.split('-') # ...

  10. lambda表达式在解决java后台分组排序时的应用

    需求:按照起始日期查询出数据库里一段连续日期的住院信息. 问题:数据库里的住院信息可能不是完整的,也就是在给出的日期区间里只有若干天的数据,缺少某些日期的数据. 解决: 1.需要我们先按日期分组查出数 ...