题目链接

题目大意:

第一行给出两个整数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(树套树(树状数组套主席树))相关推荐

  1. ICPC 徐州 H Yuuki and a problem (树状数组套主席树)

    Yuuki and a problem 先不管第一问的修改操作,考虑如何达到第二问的查询操作, 题目要我们给出一个区间[l,r][l, r][l,r]中,不能通过权值+++得到的最小的数字是什么, 假 ...

  2. H - Hello Ms. Ze(树状数组套主席树,线段树上二分)

    H - Hello Ms. Ze 给定nnn种不同的材料,第iii种材料有aia_iai​个,有mmm个操作,操作分为两类: 把第xxx种材料修改为yyy个, 只用[l,r][l, r][l,r]区间 ...

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

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

  4. 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大

    题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax​为yyy 解题思路: 首先我们知道权值线段树是 ...

  5. hdu 5077 NAND(打表)2014 Asia regional 鞍山站 H题

    题目链接:点击打开链接 题意:就是一个按位运算的一个函数.问最少经过多少步运算能够得到给定数. 思路:不是我投机取巧想打表.是特么这题仅仅能打表.. .打表思想用能够得到的数的集合表示状态bfs:最后 ...

  6. 【2019icpc徐州站】Random Access Iterator(概率dp,有坑,tricks)

    题干: Recently Kumiko learns to use containers in C++ standard template library. She likes to use the  ...

  7. 【练习手记】【多题合集】用树状数组做线段树练习1、2、3

    Warning:本篇无任何思路解释 ---------------------------------------------- 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等 ...

  8. ACM-ICPC 2018徐州网络赛-H题 Ryuji doesn't want to study

    死于update的一个long long写成int了 真的不想写过程了 ******** 树状数组,一个平的一个斜着的,怎么斜都行 题库链接:https://nanti.jisuanke.com/t/ ...

  9. 2019 ICPC徐州站总结

    退役了 自南京站爆零血崩之后,一直在跟队友调整状态,在徐州站之前状态调整的差不多,比赛预案也重做了一下,但还是打铁,由于一直在想以后的发展方向,这篇总结也就一直拖着没写 徐州站,到了徐州后身体不舒服, ...

  10. ICPC2020 沈阳站 D题

    ICPC2020 沈阳站 D题 以 PiP_iPi​ 代表前iii个字符rrr出现的次数为奇数或偶数. 从iii到jjj区间如果对答案具有贡献,则pj−pi−1p_j-p_{i-1}pj​−pi−1​ ...

最新文章

  1. 一周焦点 | Dota2团战击溃AI;不如跳舞!伯克利最新人体动作迁移研究
  2. 在WIN7系统的笔记本上建立WIFI热点
  3. python list转dict
  4. 个人整理的常用python脚本【很好用】
  5. 全栈project师的毁与誉
  6. 汇编语言程序设计-钱晓捷(第五版)学习笔记目录
  7. 小学计算机微课教案及ppt,小学数学微课程ppt
  8. c#中将word转成图片,无水印
  9. 10、(十)外汇交易中专有名词整理
  10. 360隐私保护器直指腾讯QQ 360真的发飙了,百度旁观!
  11. 用英文字母解析漩涡鸣人
  12. 静雅学校有高中吗有计算机,涿州靖雅中学
  13. 第三方系统如何与阿里商旅进行对接
  14. windows下延时函数
  15. c语言 cdma编码正交的8位码片,关于码分多址CDMA正交码片序列的进一步说明
  16. 大疆A型板使用经验分享(八)——FreeRTOS操作系统的使用
  17. Java 移位运算符 >>、<< 、>>是怎样进行运算的?
  18. Ethercat-IghMaster 1.5.2调试笔记
  19. uTools基于Everything的本地搜索拓展语法
  20. 期货市场价格发现功能的含义和特点是什么(如何理解期货市场具有价格发现经济功能)

热门文章

  1. 《并发数据结构与多核编程》作业题答案
  2. fedora 16 安装firefox flash插件
  3. 史上最全无线通信频率分配表
  4. xpath兄弟结点语法
  5. PHP 互亿无线语音通知
  6. Unity用代码写一个Inspector里面能拉动的滑条
  7. 【Arduino】wokwi在线编程仿真学习
  8. linux内核源码分析之proc文件系统(三)
  9. 安徽软件技术职业适应性测试,2019年职业适应性(职业技能)测试纲要
  10. 做人最大的无知,是错把平台当本事(深度好文)