2019icpc徐州站 H题 Yuuki and a problem(树套树(树状数组套主席树))
题目链接
题目大意:
第一行给出两个整数n,m,n代表的是数组的大小,m代表询问的个数,对于每个询问有两种形式,
1 x y 表示的是将数组a[x]改为y,2 x y 表示的是查询从x到y的序列中不能表示出的最小的数是多少,这个题目的推导在我前几天写的博客里面有提到,有兴趣的可以去看一下【题目链接】现在问题的落脚点就是怎么求一段区间的和了,因为这个数组中有n个值,那么就代表着权值线段树有n+1个版本,如果第i个版本更新了,那么很显然(i,n)的所有版本都要给他更新,这时候复杂度可就大了,咱们可以考虑用树状数组优化这个过程,就是优化每次更新的下标,其实跟传统的一样,只是树状数组的值是一棵棵权值线段树,具体请看代码吧:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 200010;
typedef long long LL;
int read() {int x=0,f=1;char c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();return x*f;
}
void write(int x) {if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');
}
int n,q;
struct node {int l,r;LL sum;
};
int A[30],B[30],cnt1,cnt2;
int idx,root[N],a[N];
node tr[N<<7];
inline int lowbit(int x) {return x & -x;
}
void insert(int &k,int l,int r,int pos,int val) {if(!k) k = ++idx;tr[k].sum += val;if(l == r) return;int mid = l + r >> 1;if(pos <= mid) insert(tr[k].l,l,mid,pos,val);else insert(tr[k].r,mid+1,r,pos,val);
}
LL query(int l,int r,int L,int R) {if(l >= L && r <= R) {LL ans = 0;for(int i=1; i<=cnt1; i++) ans -= tr[A[i]].sum;for(int i=1; i<=cnt2; i++) ans += tr[B[i]].sum;return ans;}int mid = l + r >> 1;int A1[30],B1[30];LL ans = 0;if(mid >= L) {for(int i=1; i<=cnt1; i++) A1[i] = A[i],A[i] = tr[A[i]].l;for(int j=1; j<=cnt2; j++) B1[j] = B[j],B[j] = tr[B[j]].l;ans += query(l,mid,L,R);for(int i=1; i<=cnt1; i++) A[i] = A1[i];for(int j=1; j<=cnt2; j++) B[j] = B1[j];}if(R > mid) {for(int i=1; i<=cnt1; i++) A1[i] = A[i],A[i] = tr[A[i]].r;for(int j=1; j<=cnt2; j++) B1[j] = B[j],B[j] = tr[B[j]].r;ans += query(mid+1,r,L,R);for(int i=1; i<=cnt1; i++) A[i] = A1[i];for(int j=1; j<=cnt2; j++) B[j] = B1[j];}return ans;
}
int main() {n = read();q = read();for(int i=1; i<=n; i++) {a[i] = read();for(int j=i; j<=n; j+=lowbit(j)) {insert(root[j],1,N,a[i],a[i]);}}while(q--) {int op = read();if(op == 1) {int x = read(),y = read();for(int j=x; j<=n; j+=lowbit(j)) {insert(root[j],1,N,a[x],-a[x]);}a[x] = y;for(int j=x; j<=n; j+=lowbit(j)) {insert(root[j],1,N,a[x],a[x]);}} else {int l = read(),r = read();cnt1 = cnt2 = 0;for(int i=l-1; i; i-=lowbit(i)) A[++cnt1] = root[i];for(int j=r; j; j-=lowbit(j)) B[++cnt2] = root[j];LL st = 0,pre = 0;while(1){st = query(1,N,1,min(st+1,1ll*N));if(st == pre) break;pre = st;}printf("%lld\n", st + 1);}}return 0;
}
2019icpc徐州站 H题 Yuuki and a problem(树套树(树状数组套主席树))相关推荐
- ICPC 徐州 H Yuuki and a problem (树状数组套主席树)
Yuuki and a problem 先不管第一问的修改操作,考虑如何达到第二问的查询操作, 题目要我们给出一个区间[l,r][l, r][l,r]中,不能通过权值+++得到的最小的数字是什么, 假 ...
- H - Hello Ms. Ze(树状数组套主席树,线段树上二分)
H - Hello Ms. Ze 给定nnn种不同的材料,第iii种材料有aia_iai个,有mmm个操作,操作分为两类: 把第xxx种材料修改为yyy个, 只用[l,r][l, r][l,r]区间 ...
- bzoj2683:简单题(树状数组套CDQ分分治)
CDQ(陈丹琦)分治 CDQ显然是一个人的名字(2008NOI金牌选手陈丹琦) 这种离线的分治算法在算法界被称为"CDQ分治". 首先回忆一下归并排序的分治, 它的操作是将数组二 ...
- 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大
题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax为yyy 解题思路: 首先我们知道权值线段树是 ...
- hdu 5077 NAND(打表)2014 Asia regional 鞍山站 H题
题目链接:点击打开链接 题意:就是一个按位运算的一个函数.问最少经过多少步运算能够得到给定数. 思路:不是我投机取巧想打表.是特么这题仅仅能打表.. .打表思想用能够得到的数的集合表示状态bfs:最后 ...
- 【2019icpc徐州站】Random Access Iterator(概率dp,有坑,tricks)
题干: Recently Kumiko learns to use containers in C++ standard template library. She likes to use the ...
- 【练习手记】【多题合集】用树状数组做线段树练习1、2、3
Warning:本篇无任何思路解释 ---------------------------------------------- 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等 ...
- ACM-ICPC 2018徐州网络赛-H题 Ryuji doesn't want to study
死于update的一个long long写成int了 真的不想写过程了 ******** 树状数组,一个平的一个斜着的,怎么斜都行 题库链接:https://nanti.jisuanke.com/t/ ...
- 2019 ICPC徐州站总结
退役了 自南京站爆零血崩之后,一直在跟队友调整状态,在徐州站之前状态调整的差不多,比赛预案也重做了一下,但还是打铁,由于一直在想以后的发展方向,这篇总结也就一直拖着没写 徐州站,到了徐州后身体不舒服, ...
- ICPC2020 沈阳站 D题
ICPC2020 沈阳站 D题 以 PiP_iPi 代表前iii个字符rrr出现的次数为奇数或偶数. 从iii到jjj区间如果对答案具有贡献,则pj−pi−1p_j-p_{i-1}pj−pi−1 ...
最新文章
- 一周焦点 | Dota2团战击溃AI;不如跳舞!伯克利最新人体动作迁移研究
- 在WIN7系统的笔记本上建立WIFI热点
- python list转dict
- 个人整理的常用python脚本【很好用】
- 全栈project师的毁与誉
- 汇编语言程序设计-钱晓捷(第五版)学习笔记目录
- 小学计算机微课教案及ppt,小学数学微课程ppt
- c#中将word转成图片,无水印
- 10、(十)外汇交易中专有名词整理
- 360隐私保护器直指腾讯QQ 360真的发飙了,百度旁观!
- 用英文字母解析漩涡鸣人
- 静雅学校有高中吗有计算机,涿州靖雅中学
- 第三方系统如何与阿里商旅进行对接
- windows下延时函数
- c语言 cdma编码正交的8位码片,关于码分多址CDMA正交码片序列的进一步说明
- 大疆A型板使用经验分享(八)——FreeRTOS操作系统的使用
- Java 移位运算符 >>、<< 、>>是怎样进行运算的?
- Ethercat-IghMaster 1.5.2调试笔记
- uTools基于Everything的本地搜索拓展语法
- 期货市场价格发现功能的含义和特点是什么(如何理解期货市场具有价格发现经济功能)