区间更新+单点查询
查询 更新 区间 单点
2023-09-14 08:56:53 时间
F: 操作数
题解:和刷气球那题一样,判断每个位置被更新的次数,如果是奇数输出1,偶数输出0
注意:用cin会超时
一、线段树
//注意laz[]要和线段树数组开一样大小 #include<iostream> #include<algorithm> #include<vector> #include<math.h> #include<stdio.h> #include<string.h> #include<algorithm> const int N = 100050; using namespace std; int tre[N * 4]; void pushdown(int num); // void pushdown(int num) // { // if (laz[num] != 0) // { // tre[num * 2] += laz[num]; // tre[num * 2 + 1] += laz[num]; // laz[num * 2] += laz[num]; // laz[num * 2 + 1] += laz[num]; // laz[num] = 0; // } // } void update(int num, int le, int ri, int x, int y) { if (le >= x && ri <= y) { tre[num]++; return; } int mid = (le + ri) >> 1; if (tre[num]) pushdown(num); if (x <= mid) update(num << 1, le, mid, x, y); if (y > mid) update(num << 1 | 1, mid + 1, ri, x, y); } void pushdown(int num) { tre[num << 1] += tre[num]; tre[num << 1 | 1] += tre[num]; tre[num] = 0; } int query(int num, int le, int ri, int x) { if (le == ri) return tre[num]; int ans, mid = (le + ri) >> 1; if (tre[num]) pushdown(num); if (x <= mid) ans = query(num << 1, le, mid, x); else ans = query(num << 1 | 1, mid + 1, ri, x); return ans; } int main() { int t, n, m; scanf("%d%d",&n,&m); memset(tre, 0, sizeof(tre)); //memset(laz, 0, sizeof(laz));//初始化延迟标记 while (m--) { scanf("%d",&t); if (t == 1) { int x, y; scanf("%d%d",&x,&y); update(1, 1, n, x, y); } else { int x; scanf("%d",&x); int cnt = query(1, 1, n, x); if (cnt % 2 == 0) cout << 0 << endl; else cout << 1 << endl; } } return 0; }
二、树状数组
树状数组区间更新,因为树状数组都是从起点开始一直更新到最后一个位置,所以在更新区间的时候要用到类似前缀和的思想
将区间[x,y]的值加z(z可正可负)
1、将区间[x,n]的值加上z
2、将区间[y,n]的值减上z
以上两步实现将区间[x,y]的值加上z
//注意laz[]要和线段树数组开一样大小 #include<iostream> #include<algorithm> #include<vector> #include<math.h> #include<stdio.h> #include<string.h> #include<algorithm> const int N = 5000005; using namespace std; int n,m; int c[N]; int lowbit(int x) { return x&-x; } void update(int x,int p) { while (x<=n) { c[x]+=p; x+=lowbit(x); } } int sum(int x) { int ans=0; while (x) { ans+=c[x]; x-=lowbit(x); } return ans; } int main() { scanf("%d%d",&n,&m); memset(c,0,sizeof(c)); while(m--) { int t,x,y; scanf("%d",&t); if (t==1) { scanf("%d%d",&x,&y); update(x,1); update(y+1,-1); } else { scanf("%d",&x); if (sum(x)%2==1) printf("1\n"); else printf("0\n"); } } return 0; }
相关文章
- java查询 盘符 下某种后缀的所有文件的绝对路径
- 【手机在网状态查询】实时更新,超高准确率
- 【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 逐行遍历文件文本数据 | 获取文件中的文本行 | 查询文本行数据 | 追加文件数据 | 使用占位符方式拼接字符串 )
- 天气预报查询 API + AI 等于王炸(一大波你未曾设想的天气预报查询 API 应用场景更新了)
- 利用Oracle字符串查询实现数据更新(oracle字符串查询)
- Oracle 查询优化技巧(oracle查询更新)
- 提升效率:使用Oracle查询数据快速更新(oracle查询数据更新)
- 查找Oracle数据库文件路径的指南(查询oracle文件路径)
- Java与MySQL编程实现数据查询、存储、更新与删除!(javamysql编程)
- 如何优化MySQL查询速度(mysql优化查询速度)
- Oracle数据库查询最大值(oracle查询最大值)
- MySQL如何利用取模运算优化数据库查询(mysql取模)
- 掌握mysql读取技巧,轻松查询数据(mysql一般怎么读)
- Oracle数据库中表信息查询实践(oracle中表查询)
- MySQL模糊查询实现技巧(mysql_模糊查询)
- Oracle上周五查询结果一览(oracle上周五查询)
- Oracle三表内连接查询实现数据更新(oracle三个表内连接)
- 深入了解Redis哨兵服务的查询命令(redis查看哨兵命令)
- asp.net中gridview的查询、分页、编辑更新、删除的实例代码
- mysql跨表查询、更新、删除示例
- 跟老齐学Python之使用Python查询更新数据库
- 利用带关联子查询Update语句更新数据的方法