嗯...

题目链接: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. nodejs npm安装教程

    一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...

  2. c#常用控件及简写

    c#常用控件及简写

  3. 主库增加表空间导致DG同步失败

    由于主库表空间不足,同事给表空间增加数据文件,第二天收到反馈说备库未同步. 1.主.备查看归档序列号,发现主.备归档正常同步. SQL>archive log list 2.在主库端查询v$ar ...

  4. Bugku-web进阶之phpcmsV9(一个靶机而已,别搞破坏。flag在根目录里txt文件里)

    phpcmsV9 一个靶机而已,别搞破坏. flag在根目录里txt文件里 http://123.206.87.240:8001/    

  5. 09day 命令提示符优化及yum优化

    export PS1='\[\e[32;1m\][\u@\h \W]\$ \[\e[0m\]' 设置颜色 内容 结束 export PS1='\[\e[30;1m\][\u@\h \W]\$ \[\e ...

  6. 动手实现CapsNet系列——1 概述

    Geoffrey Hinton是深度学习的开创者之一,反向传播等神经网络经典算法发明人,他在17年年底和他的团队发表了两篇论文,介绍了一种全新的神经网络,这种网络基于一种称为胶囊(Capsule)的结 ...

  7. 433B.Kuriyama Mirai's Stones

    Kuriyama Mirai has killed many monsters and got many (namely n) stones. She numbers the stones from  ...

  8. docker容器虚拟化网络

    linux内核支持六种名称空间 1.主机名和域名  ------->  UTS 2.用户  -------->  User 3.文件挂载系统   ------->  mount 4. ...

  9. C语言如何判断单个数字是否溢出:

    如何判断一个输入或者输出转化的单个数字是否溢出: if( num>0x7fffffff || num<(signed int)0x80000000) 注意: int类型的最大正数:0x7f ...

  10. 三大查找算法(Java实现)

    三大查找算法 1.二分查找(Binary Search) public class BinarySearch { public static void main(String[] args) { in ...