Yuuki and a problem

先不管第一问的修改操作,考虑如何达到第二问的查询操作,

题目要我们给出一个区间[l,r][l, r][l,r]中,不能通过权值+++得到的最小的数字是什么,

假设我们已经可以得到[1,x][1, x][1,x]之间的数了,且,我们询问权值在[1,x+1][1, x + 1][1,x+1]之间的和为sumsumsum,那么[1,sum][1, sum][1,sum]之间的数一定能通过+++法得到,

我们分类讨论一下:

以此每次递增查询,最多就是一个斐波那契数列的形式,所以最多查询不到303030次。

再考虑第一问的修改操作,修改操作,跟区间查询操作连到一起容易想到带修主席树(树状数组套主席树),

整体复杂度30×mlog⁡nlog⁡n30 \times m \log n \log n30×mlognlogn。

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 2e5 + 10, maxn = 200000;int a[N], n, m;int root[N], ls[N << 7], rs[N << 7], num;ll sum[N << 7];int A[N], B[N], cnt1, cnt2;inline int lowbit(int x) {return x & (-x);
}void update(int &rt, int l, int r, int x, int v) {if (!rt) {rt = ++num;}sum[rt] += v;if (l == r) {return ;}int mid = l + r >> 1;if (x <= mid) {update(ls[rt], l, mid, x, v);}else {update(rs[rt], mid + 1, r, x, v);}
}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 -= sum[A[i]];}for (int i = 1; i <= cnt2; i++) {ans += sum[B[i]];}return ans;}int mid = l + r >> 1;ll ans = 0;if (L <= mid) {int A1[30], B1[30];for (int i = 1; i <= cnt1; i++) {A1[i] = A[i];A[i] = ls[A[i]];}for (int i = 1; i <= cnt2; i++) {B1[i] = B[i];B[i] = ls[B[i]];}ans += query(l, mid, L, R);for (int i = 1; i <= cnt1; i++) {A[i] = A1[i];}for (int i = 1; i <= cnt2; i++) {B[i] = B1[i];}}if (R > mid) {int A1[30], B1[30];for (int i = 1; i <= cnt1; i++) {A1[i] = A[i];A[i] = rs[A[i]];}for (int i = 1; i <= cnt2; i++) {B1[i] = B[i];B[i] = rs[B[i]];}ans += query(mid + 1, r, L, R);for (int i = 1; i <= cnt1; i++) {A[i] = A1[i];}for (int i = 1; i <= cnt2; i++) {B[i] = B1[i];}}return ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);for (int j = i; j <= n; j += lowbit(j)) {update(root[j], 1, maxn, a[i], a[i]);}}for (int i = 1; i <= m; i++) {int op, x, y;scanf("%d %d %d", &op, &x, &y);if (op & 1) {for (int j = x; j <= n; j += lowbit(j)) {update(root[j], 1, maxn, a[x], -a[x]);}a[x] = y;for (int j = x; j <= n; j += lowbit(j)) {update(root[j], 1, maxn, a[x], a[x]);}}else {cnt1 = cnt2 = 0;for (int j = x - 1; j; j -= lowbit(j)) {A[++cnt1] = root[j];}for (int j = y; j; j -= lowbit(j)) {B[++cnt2] = root[j];}ll cur = 0, sum = 0;do {cur = sum + 1;sum = query(1, maxn, 1, min(cur, 1ll * maxn));}while (sum >= cur);printf("%lld\n", sum + 1);}}return 0;
}

ICPC 徐州 H Yuuki and a problem (树状数组套主席树)相关推荐

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

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

  2. #279. [SYZOI Round1] 滑稽♂树(树状数组套主席树)

    #279. [SYZOI Round1] 滑稽♂树 子树上的问题,考虑dfsdfsdfs序,第kkk大,可以用主席树嘛,支持修改,那就树状数组上套主席树,参考P4175 [CTSC2008]网络管理( ...

  3. 【BZOJ1901】Dynamic Rankings,树状数组套主席树

    Time:2016.05.09 Author:xiaoyimi 转载注明出处谢谢 传送门(权限) 题面 1901: Zju2112 Dynamic Rankings Time Limit: 10 Se ...

  4. zoj 2112 树状数组 套主席树 动态求区间 第k个数

    总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...

  5. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

  6. BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...

  7. BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树

    题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1 ],a[i+2]--a[j]中第k小的数是多少(1≤k ...

  8. 洛谷 - P2617 Dynamic Rankings(树状数组套主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,再给出 m 次操作: Q l r k:返回区间 [ l , r ] 内第 k 大的数 C x y:令 a[ x ] = y 题目分析:其实 ...

  9. BZOJ1901 Zju2112 Dynamic Rankings 【树状数组套主席树】

    题目 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k≤j- ...

最新文章

  1. 百度CTO王海峰博鳌解读AI“融合创新”,算力算法数据发挥综合作用
  2. zookeeper安装教程(zookeeper3.4.5为例)
  3. java7新特性之Try-with-resources statement
  4. AbilitySlice之间的回传值
  5. ubuntu apt-mirror 同步源到本地
  6. 以Windows服务方式运行.NET Core程序
  7. sublime 代码格式化
  8. [css] 固定的外框尺寸,里面的图片尺寸不固定,如何让图像自适应外框呢?
  9. 萤火虫小程序_9.9元起!萤火虫中秋文化节来了!特价门票限量秒杀,手慢无!...
  10. python环绕文字_如何用css实现文字三面环绕图片?
  11. oracle 数据树,ORACLE 树形数据
  12. matlab图像大作业,MATLAB图像大作业
  13. 从零开始刷Leetcode——数组(941.977)
  14. Linux从初学到精通
  15. Spring BeanFactory、ApplicationContext IOC 容器获取与使用
  16. html 正则表达式密码判断,JS利用正则表达式实现简单的密码强弱判断实例
  17. phython在file同时写入两个_Python实现读取excel写入mysql的小工具详解
  18. VCPKG 升级问题
  19. 简单的音频转文字的转换方法
  20. linux cpu使用率太高,小技巧:教您一个窍门!解决Linux下CPU使用率过高的问题

热门文章

  1. 【C语言简单说】二:第一个C语言程序详解(3)
  2. python随机抽取人名_python的random
  3. 踩自行车来进行人力发电,真的能驱动旋转木马吗?
  4. 假如有人在今天炸了支付宝的存储服务器...
  5. java aspose重叠_Aspose.Words - 在特定位置合并两个文档
  6. linux代码段起始地址设置,Arch Linux安装后的一些初始设置简介
  7. dialog element 删掉标题_ElementUI 销毁Dialog数据(简单粗暴)
  8. oracle+11g+rda,Oracle RDA 4.20 初体验
  9. java .this的用法_JAVA中this用法小结
  10. php获取某地的ip,php获取本土实际IP