带修主席树模板题

主席树的单点修改就是把前缀和(大概)的形式改成用树状数组维护,每个树状数组的元素都套了一个主席树(相当于每个数组的元素root[i]都是主席树,且这个主席树维护了(i - lowbit(i) + 1, i)这个区间的值域信息)

修改的时候就是沿着lowbit把包含了该点的区间全部替换成新的线段树就行了~

回答和静态主席树差不多,不过不是两颗树相减,因为要知道前缀所有值域的信息,所以区间左边和右边都要同时往后沿着lowbit跳完所有的主席树。

注意的是主席树修改需要离线,因为我们要先离散化,如果提前处理好修改的值的话,离散化之后可能会没有新数的位置。

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define full(a, b) memset(a, b, sizeof a)
using namespace std;
typedef long long ll;
inline int lowbit(int x){ return x & (-x); }
inline int read(){int X = 0, w = 0; char ch = 0;while(!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }while(isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();return w ? -X : X;
}
inline int gcd(int a, int b){ return a % b ? gcd(b, a % b) : b; }
inline int lcm(int a, int b){ return a / gcd(a, b) * b; }
template<typename T>
inline T max(T x, T y, T z){ return max(max(x, y), z); }
template<typename T>
inline T min(T x, T y, T z){ return min(min(x, y), z); }
template<typename A, typename B, typename C>
inline A fpow(A x, B p, C lyd){A ans = 1;for(; p; p >>= 1, x = 1LL * x * x % lyd)if(p & 1)ans = 1LL * x * ans % lyd;return ans;
}
const int N = 300005;
int n, m, cnt, tot, x, y, a[N], b[N], lc[N<<8], rc[N<<8], root[N], tree[N<<8], lt[N], rt[N];
struct Query{bool isq;int l, r, pos, k;
}query[100005];int modify(int rt, int l, int r, int pos, int k){int cur = ++cnt;tree[cur] = tree[rt] + k, lc[cur] = lc[rt], rc[cur] = rc[rt];if(l == r) return cur;int mid = (l + r) >> 1;if(pos <= mid) lc[cur] = modify(lc[rt], l, mid, pos, k);else rc[cur] = modify(rc[rt], mid + 1, r, pos, k);return cur;
}void add(int k, int x){int p = (int)(lower_bound(b + 1, b + tot + 1, a[k]) - b);for(int i = k; i <= n; i += lowbit(i))root[i] = modify(root[i], 1, tot, p, x);
}int queryQAQ(int k, int l, int r){if(l == r) return l;int suml = 0, sumr = 0;for(int i = 1; i <= x; i ++) suml += tree[lc[lt[i]]];for(int i = 1; i <= y; i ++) sumr += tree[lc[rt[i]]];int mid = (l + r) >> 1;if(sumr - suml >= k){for(int i = 1; i <= x; i ++) lt[i] = lc[lt[i]];for(int i = 1; i <= y; i ++) rt[i] = lc[rt[i]];return queryQAQ(k, l, mid);}else{for(int i = 1; i <= x; i ++) lt[i] = rc[lt[i]];for(int i = 1; i <= y; i ++) rt[i] = rc[rt[i]];return queryQAQ(k - (sumr - suml), mid + 1, r);}
}int main(){n = read(), m = read();for(int i = 1; i <= n; i ++){a[i] = read();b[++tot] = a[i];}for(int i = 1; i <= m; i ++){char opt[3]; scanf("%s", opt);if(opt[0] == 'C'){query[i].isq = true;query[i].pos = read(), query[i].k = read();b[++tot] = query[i].k;}else{query[i].isq = false;query[i].l = read(), query[i].r = read(), query[i].k = read();}}sort(b + 1, b + tot + 1);tot = (int)(unique(b + 1, b + tot + 1) - b - 1);for(int i = 1; i <= n; i ++) add(i, 1);for(int i = 1; i <= m; i ++){if(query[i].isq){int pos = query[i].pos;add(pos, -1);a[pos] = query[i].k;add(pos, 1);}else{x = y = 0;for(int j = query[i].l - 1; j; j -= lowbit(j)) lt[++x] = root[j];for(int j = query[i].r; j; j -= lowbit(j)) rt[++y] = root[j];printf("%d\n", b[queryQAQ(query[i].k, 1, tot)]);}}return 0;
}

转载于:https://www.cnblogs.com/onionQAQ/p/10776556.html

洛谷P2617 Dynamic Rankings相关推荐

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

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

  2. P2617 Dynamic Rankings(整体二分)

    P2617 Dynamic Rankings 题意: 待修改的区间最值问题 题解: 整体二分天然带有修改性 整体二分做不带修改的区间最值->看这里 现在待修改,我们可以将第l位修改为x,因为我们 ...

  3. P2617 Dynamic Rankings(带修改主席树)

    P2617 Dynamic Rankings 带修改主席树 能进行对序列中数进行修改 #include<iostream> #include<string.h> #includ ...

  4. P2617 Dynamic Rankings

    题目链接:https://www.luogu.org/problem/P2617 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j, ...

  5. P2617 Dynamic Rankings 动态区间第K大【树套树】或【整体二分】

    传送门 动态区间第KKK大问题,单点修改(这里是第kkk小,即是从小到大第kkk个) 这里还有个区间修改,有点类似的 P3332 [ZJOI2013]K大数查询 分析 树套树 树套树,就是用一种树形结 ...

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

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

  7. P2617 Dynamic Rankings(带修主席树)

    所谓带修主席树,就是用树状数组的方法维护主席树的前缀和 思路 带修主席树的板子 注意数据范围显然要离散化即可 代码 #include <cstdio> #include <cstri ...

  8. P2617 Dynamic Rankings 整体二分

    树套树板子题,但是整体二分不管是时间复杂度还是空间复杂度都表现更优秀,所以用整体二分来水一波. 普通的整体二分是没有修改操作的.然鹅我们处理修改操作也比较容易,直接减上这个数,让后加上修改之后的数即可 ...

  9. P2617 Dynamic Rankings(主席树+树状数组)

    怕是还没有题解,所以先写一篇. 这题就是维护带修改的主席树.首先树套树肯定是能做的,既然树套树能做那么整体二分肯定也是可以的. 由于我并没有使用这两种做法,所以此处不予介绍. 大概描述下主席树的思路: ...

最新文章

  1. 郎凤娥谈定西实施煤粉锅炉改造项目
  2. 一款好用 mongodb 可视化工具
  3. 【uni-app】小程序实现微信在线聊天(私聊/群聊)
  4. spark代码连接hive_Spark SQL入门到实战之(7)spark连接hive(spark-shell和eclipse两种方式)...
  5. ASP.NET MVC3 技术(二) WebGrid 的使用方法
  6. BCNF/3NF的判断方法
  7. 腾讯发布企鹅号“达人计划”清退公告 清退后当月结算将被取消
  8. NOIP2008pj luoguP1058 立体图 模拟
  9. webpack入坑之旅(一)入门安装
  10. c语言程序学生档案管理系统,C语言 班级档案管理系统实现
  11. SD卡windows无法格式化
  12. 铁道部新客票系统设计
  13. HR 真的会嫌弃面试者跳槽频繁吗?
  14. java 判断对象的属性是否为空_Java 判断实体对象及所有属性是否为空的操作
  15. A dependency may only have one source.
  16. 关于OpenHarmony蜂窝通信框架能力的说明
  17. 关于数据中台、数据平台、数据仓库、数据湖等数据概念的对比解析
  18. 报表工具对比之样式——BIRT报表VS润乾报表
  19. D7100 调节白平衡
  20. proto2java

热门文章

  1. umts是移动还是联通_联通与电信合建5G:核心网各自建设 5G频率资源共享
  2. python是动态还是静态_python之静态方法和动态方法介绍
  3. c 语言随机验证码原理,用C生成随机中文汉字验证码的基本原理及代码.doc
  4. Spring @Configuration
  5. Spring 解耦反射创建对象
  6. javascript Blob
  7. MySQL json-table-functions
  8. Vue结合Echarts
  9. pandas 散布矩阵
  10. golang | 使用goroutine和channel实现一个计算int64随机数各位数和的程序。