嗯...

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

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

 1 #include<cstdio>
 2 #include<iostream>
 3
 4 using namespace std;
 5
 6 int a[100005], b[100005];
 7
 8 int main(){
 9     int n, m, t, l, r, x;
10     scanf("%d%d", &n, &m);
11     for(int i = 1; i <= n; i++) b[i] = a[i] ^ a[i - 1];
12     for(int i = 1; i <= m; i++){
13         scanf("%d", &t);
14         if(t == 1){
15             scanf("%d%d", &l, &r);
16             b[l] ^= 1;
17             b[r + 1] ^= 1;
18             for(int i = 1; i <= n; i++)
19                 a[i] = a[i - 1] ^ b[i];
20         }
21         else{
22             scanf("%d", &x);
23             printf("%d\n", a[x]);
24         }
25     }
26     return 0;
27 }
28             

50分-差分

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

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

AC代码:

#include<cstdio>
#include<iostream>using namespace std;int n, t[1000005];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 = 0;while(x > 0){ans += t[x];x -= lowbit(x);}return ans;
}//单点查询int main(){int m, l, r, f, d;scanf("%d%d", &n, &m);for(int i = 1; i <= m; i++){scanf("%d", &f);if(f == 1){scanf("%d%d", &l, &r);change(l, 1);change(r + 1, -1);}else{scanf("%d", &d);printf("%d\n", check(d) % 2);//核心
        }}return 0;
}

AC代码

转载于:https://www.cnblogs.com/New-ljx/p/11267274.html

洛谷 P5057 [CQOI2006]简单题(树状数组)相关推荐

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

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

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

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

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

    题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...

  4. bzoj2683:简单题(树状数组套CDQ分分治)

    CDQ(陈丹琦)分治 CDQ显然是一个人的名字(2008NOI金牌选手陈丹琦) 这种离线的分治算法在算法界被称为"CDQ分治".  首先回忆一下归并排序的分治, 它的操作是将数组二 ...

  5. 洛谷P2357 守墓人(差分+树状数组)

    原题链接 什么是差分? 7 8 6 5 8 18 20 35 //原数组 7 1 -2 -1 3 10 2 15 //差分数组 差分数组的前缀sum[i]即原数组的a[i] 我们构建两个树状数组 su ...

  6. 洛谷P3368 【模板】树状数组 2(Python和C++代码)

    ##就是常规写法 用树状数组维护一个差分数组的前缀和,因为可推得若b[i]=a[i]-a[i-1],则a[i]=b[1]+-+b[i] (b[1]=a[1]-a[0],a[0]=0) . 可发现a[i ...

  7. [洛谷P1908] 逆序对|归并排序|树状数组

     题目描述 Description 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为&qu ...

  8. 洛谷 P1908 逆序对(树状数组+离散化)

    题目描述 猫猫 TOM 和小老鼠 JERRY 最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计. 最近,TOM 老猫查阅到一个人类称之为"逆序对& ...

  9. 洛谷P2448 无尽的生命 树状数组

    给出231−12^{31}-1231−1范围的1−n1-n1−n的数列,然后有不超过k≤1e5k\leq1e5k≤1e5次交换,求问最终的逆序对的个数是多少. 被交换的值不超过2k2k2k个,然后再考 ...

最新文章

  1. 聊聊linux查看服务和端口状态命令netstat
  2. java 如何解密_java加密与解密
  3. linux启动服务器ftp监听,Linux redhat6.5开启ftp服务
  4. 全面剖析【二叉树】的各类遍历方法
  5. 一文带你学会 UML 统一建模语言
  6. c语言条件语句示例_PHP中的条件语句和示例
  7. Web框架——Flask系列之设置和读取cookie(十五)
  8. linux进程cpu时间片,能讲一下在Linux系统中时间片是怎么分配的还有优先级的具体算法是...
  9. AJAX技术文案沙雕,vue-router 中使用 keep-alive 控制 ajax 请求的缓存策略(二)
  10. layerdate一款很好用日期插件
  11. 简单分析minidump
  12. Java带有效期的Map
  13. 论述嵌入式linux根文件系统6,嵌入式linux根文件系统制作,大神手把手教你
  14. Mac解压缩rar文件
  15. 百度版ChatGPT:文心一言发布会盛大召开!
  16. c语言中用递推法解决渔夫问题,递归、递推 - IT小冰的个人空间 - OSCHINA - 中文开源技术交流社区...
  17. 【已恢复】苹果再堵开发者账号注册漏洞,黑市账号价格有价无市!
  18. 【MySQL】MacM1下的MySQL安装与配置
  19. 如何解决数组下标越界异常
  20. 使用python下载图片(新手代码)

热门文章

  1. 2022-2028年中国共享住宿行业深度调研及投资前景预测报告
  2. Mysql生成UUID
  3. tensorflow2.0 基础一 常用数据类型及转换
  4. Turing渲染着色器网格技术分析
  5. 汽车车灯灯具系统(下)
  6. 2021年大数据常用语言Scala(十六):基础语法学习 列表 List 重点掌握
  7. Python ModuleNotFoundError: No module named ‘xlrd‘
  8. Java 的 API、JDK 和 IDE 是什么
  9. ThinkPHP5.1接收post、get参数
  10. 微信小程序中的tabBar设置