luogu 3380
树状数组套权值线段树
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cmath>
- #include <cstring>
- #include <string>
- #define E exit(0)
- using namespace std;
- #define LL long long
- #define gc getchar()
- inline int read() {int x = ; char c = gc; while(c < '' || c > '') c = gc;
- while(c >= '' && c <= '') x = x * + c - '', c = gc; return x;}
- inline LL read_LL() {LL x = ; char c = gc; while(c < '' || c > '') c = gc;
- while(c >= '' && c <= '') x = x * + c - '', c = gc; return x;}
- #undef gc
- const int N = 5e4 + ;
- const int Out = ;
- struct Node {int opt, l, r, k;} Ask[N];
- int n, m;
- int Num[N << ], totNum, A[N], Length;
- int Root[N];
- int W[N * ], Lson[N * ], Rson[N * ];
- int Add_root[N], Cut_root[N];
- int Hjt_;
- namespace Seg {
- void Insert(int &rt, int l, int r, int x) {
- if(!rt) rt = ++ Hjt_;
- W[rt] ++;
- if(l == r) return ;
- int mid = (l + r) >> ;
- if(x <= mid) Insert(Lson[rt], l, mid, x);
- else Insert(Rson[rt], mid + , r, x);
- }
- int Getrank(int l, int r, int k, int opt) {
- if(l == r) {
- if(opt == ) return ;
- int s = ;
- for(int i = ; i <= Add_root[]; i ++) s += W[Add_root[i]];
- for(int i = ; i <= Cut_root[]; i ++) s -= W[Cut_root[i]];
- return s;
- }
- int mid = (l + r) >> ;
- if(k <= mid) {
- for(int i = ; i <= Add_root[]; i ++) Add_root[i] = Lson[Add_root[i]];
- for(int i = ; i <= Cut_root[]; i ++) Cut_root[i] = Lson[Cut_root[i]];
- return Getrank(l, mid, k, opt);
- } else {
- int sum = ;
- for(int i = ; i <= Add_root[]; i ++) {
- sum += W[Lson[Add_root[i]]]; Add_root[i] = Rson[Add_root[i]];
- }
- for(int i = ; i <= Cut_root[]; i ++) {
- sum -= W[Lson[Cut_root[i]]]; Cut_root[i] = Rson[Cut_root[i]];
- }
- int ret = sum + Getrank(mid + , r, k, opt);
- return ret;
- }
- }
- int Getnum(int l, int r, int k) {
- if(l == r) return l;
- int mid = (l + r) >> ;
- int sum = ;
- for(int i = ; i <= Add_root[]; i ++) sum += W[Lson[Add_root[i]]];
- for(int i = ; i <= Cut_root[]; i ++) sum -= W[Lson[Cut_root[i]]];
- if(sum >= k) {
- for(int i = ; i <= Add_root[]; i ++) Add_root[i] = Lson[Add_root[i]];
- for(int i = ; i <= Cut_root[]; i ++) Cut_root[i] = Lson[Cut_root[i]];
- Getnum(l, mid, k);
- } else {
- for(int i = ; i <= Add_root[]; i ++) Add_root[i] = Rson[Add_root[i]];
- for(int i = ; i <= Cut_root[]; i ++) Cut_root[i] = Rson[Cut_root[i]];
- Getnum(mid + , r, k - sum);
- }
- }
- void Poi_G(int l, int r, int x, int val) {
- for(int i = ; i <= Cut_root[]; i ++) W[Cut_root[i]] += val;
- if(l == r) return ;
- int mid = (l + r) >> ;
- if(x <= mid) {
- for(int i = ; i <= Cut_root[]; i ++) {
- if(Lson[Cut_root[i]] == ) Lson[Cut_root[i]] = ++ Hjt_;
- Cut_root[i] = Lson[Cut_root[i]];
- }
- Poi_G(l, mid, x, val);
- } else {
- for(int i = ; i <= Cut_root[]; i ++) {
- if(Rson[Cut_root[i]] == ) Rson[Cut_root[i]] = ++ Hjt_;
- Cut_root[i] = Rson[Cut_root[i]];
- }
- Poi_G(mid + , r, x, val);
- }
- }
- int Asknum(int l, int r, int k) {
- if(l == r) {
- int sum = ;
- for(int i = ; i <= Add_root[]; i ++) sum += W[Add_root[i]];
- for(int i = ; i <= Cut_root[]; i ++) sum -= W[Cut_root[i]];
- k -= sum;
- if(k > ) return -;
- return l;
- }
- int sum = ;
- for(int i = ; i <= Add_root[]; i ++) sum += W[Lson[Add_root[i]]];
- for(int i = ; i <= Cut_root[]; i ++) sum -= W[Lson[Cut_root[i]]];
- int mid = (l + r) >> ;
- if(k <= sum) {
- for(int i = ; i <= Add_root[]; i ++) Add_root[i] = Lson[Add_root[i]];
- for(int i = ; i <= Cut_root[]; i ++) Cut_root[i] = Lson[Cut_root[i]];
- Asknum(l, mid, k);
- } else {
- for(int i = ; i <= Add_root[]; i ++) Add_root[i] = Rson[Add_root[i]];
- for(int i = ; i <= Cut_root[]; i ++) Cut_root[i] = Rson[Cut_root[i]];
- Asknum(mid + , r, k - sum);
- }
- }
- }
- namespace Bit {
- inline int Lowbit(int x) {return (x & (-x));}
- void Add(int rt, int x, int val) {
- for(int i = rt; i <= n; i += Lowbit(i)) {
- Seg:: Insert(Root[i], , Length, x);
- }
- }
- int Getrank(int l, int r, int k) {
- Add_root[] = Cut_root[] = ;
- for(int i = r; i >= ; i -= Lowbit(i)) Add_root[++ Add_root[]] = Root[i];
- for(int i = l - ; i >= ; i -= Lowbit(i)) Cut_root[++ Cut_root[]] = Root[i];
- k = lower_bound(Num + , Num + Length + , k) - Num;
- return Seg:: Getrank(, Length, k, );
- }
- int Getnum(int l, int r, int k) {
- Add_root[] = Cut_root[] = ;
- for(int i = r; i >= ; i -= Lowbit(i)) {
- Add_root[++ Add_root[]] = Root[i];
- }
- for(int i = l - ; i >= ; i -= Lowbit(i)) {
- Cut_root[++ Cut_root[]] = Root[i];
- }
- return Seg:: Getnum(, Length, k);
- }
- void Poi_G(int x, int k) {
- Cut_root[] = ;
- for(int i = x; i <= n; i += Lowbit(i)) Cut_root[++ Cut_root[]] = Root[i];
- int a = lower_bound(Num + , Num + Length + , A[x]) - Num;
- A[x] = k;
- Seg:: Poi_G(, Length, a, -);
- Cut_root[] = ;
- for(int i = x; i <= n; i += Lowbit(i)) Cut_root[++ Cut_root[]] = Root[i];
- a = lower_bound(Num + , Num + Length + , k) - Num;
- Seg:: Poi_G(, Length, a, );
- }
- int Asknum(int l, int r, int k, int opt) {
- k = lower_bound(Num + , Num + Length + , k) - Num;
- int kk = k;
- Add_root[] = Cut_root[] = ;
- for(int i = r; i >= ; i -= Lowbit(i)) Add_root[++ Add_root[]] = Root[i];
- for(int i = l - ; i >= ; i -= Lowbit(i)) Cut_root[++ Cut_root[]] = Root[i];
- k = Seg:: Getrank(, Length, k, );
- Add_root[] = Cut_root[] = ;
- for(int i = r; i >= ; i -= Lowbit(i)) Add_root[++ Add_root[]] = Root[i];
- for(int i = l - ; i >= ; i -= Lowbit(i)) Cut_root[++ Cut_root[]] = Root[i];
- int k2 = Seg:: Getrank(, Length, kk, );
- Add_root[] = Cut_root[] = ;
- for(int i = r; i >= ; i -= Lowbit(i)) Add_root[++ Add_root[]] = Root[i];
- for(int i = l - ; i >= ; i -= Lowbit(i)) Cut_root[++ Cut_root[]] = Root[i];
- if(opt == ) {
- if(k == ) return -;
- return Seg:: Asknum(, Length, k - );
- }
- else return Seg:: Asknum(, Length, k2 + );
- }
- }
- int main() {
- n = read(), m = read();
- for(int i = ; i <= n; i ++) Num[i] = read(), A[i] = Num[i];
- totNum = n;
- for(int i = ; i <= m; i ++) {
- Ask[i].opt = read();
- if(Ask[i].opt != ) {Ask[i].l = read(), Ask[i].r = read(), Ask[i].k = read();}
- else Ask[i].l = read(), Ask[i].k = read(), Num[++ totNum] = Ask[i].k;
- if(Ask[i].opt == || Ask[i].opt == ) {
- Num[++ totNum] = Ask[i].k;
- }
- }
- sort(Num + , Num + totNum + );
- Length = unique(Num + , Num + totNum + ) - Num - ;
- for(int i = ; i <= n; i ++) {
- int a = lower_bound(Num + , Num + Length + , A[i]) - Num;
- Bit:: Add(i, a, );
- }
- #define opt Ask[i].opt
- #define l Ask[i].l
- #define r Ask[i].r
- #define k Ask[i].k
- for(int i = ; i <= m; i ++) {
- if(opt == ) {
- cout << Bit:: Getrank(l, r, k) << "\n";
- } else if(opt == ) {
- int ans = Bit:: Getnum(l, r, k);
- cout << Num[ans] << "\n";
- } else if(opt == ) {
- Bit:: Poi_G(l, k);
- } else if(opt == ) {
- int ans = Bit:: Asknum(l, r, k, );
- if(ans == -) cout << "-2147483647" << "\n";
- else cout << Num[ans] << "\n";
- } else {
- int ans = Bit:: Asknum(l, r, k, );
- if(ans == -) cout << "" << "\n";
- else cout << Num[ans] << "\n";
- }
- }
- return ;
- }
luogu 3380的更多相关文章
- bzoj 3196 && luogu 3380 JoyOI 1730 二逼平衡树 (线段树套Treap)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3196 题面; 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Se ...
- Luogu 魔法学院杯-第二弹(萌新的第一法blog)
虽然有点久远 还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题 沉迷游戏,伤感情 #include <queue> ...
- luogu p1268 树的重量——构造,真正考验编程能力
题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...
- [luogu P2170] 选学霸(并查集+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...
- [luogu P2647] 最大收益(贪心+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...
- Luogu 考前模拟Round. 1
A.情书 题目:http://www.luogu.org/problem/show?pid=2264 赛中:sb题,直接暴力匹配就行了,注意一下读入和最后一句话的分句 赛后:卧槽 怎么只有40 B.小 ...
- luogu P2580 于是他错误的点名开始了
luogu P2580 于是他错误的点名开始了 https://www.luogu.org/problem/show?pid=2580 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边 ...
- CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)
CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...
- Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)
Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...
随机推荐
- windows 下搭建go开发环境
下载golang安装包: 步骤一: 先打开环境变量配置的界面 步骤二;配置我们的环境变量 对上图的一个说明: 1).path这个变量不需要再创建,因为系统本就有,在后面添加即可. 2).增加Go的bi ...
- Vector、ArrayList异同和HTTP请求异同的概括和区别
今天我所记录的是两个异同的概括: HTTP: 同步请求:提交请求->等待服务器处理->处理完毕返回给客户端 这个期间客户端浏览器只能处于等待状态,得到回应才可以执行下一步操作. 异步请求 ...
- 在微服务架构中service mesh是什么?
在微服务架构中service mesh是什么 什么是 service mesh ? 微服务架构将软件功能隔离为多个独立的服务,这些服务可独立部署,高度可维护和可测试,并围绕特定业务功能进行组织. 这些 ...
- github的pull request是指什么意思?有什么用处(转)
https://www.cnblogs.com/-walker/p/6093277.html
- java 线程实现、线程暂停和终止 、线程联合join、线程基本信息获取和设置、线程优先级
转载地址:速学堂 https://www.sxt.cn/Java_jQuery_in_action/eleven-inheritthread.html 1. 通过继承Thread类实现多线程 继承Th ...
- django.http.request中HttpRequest对象的一些属性与方法
HttpRequest对象的属性 属性 描述 path 表示提交请求页面完整地址的字符串,不包括域名,如 "/music/bands/the_beatles/". method 表 ...
- jQuery的显示和隐藏
在 jQuery 中可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素,以及使用 toggle() 方法能够切换 hide() 和 show() 方法. 隐藏例子: <! ...
- [转]github 上传project代码
原文地址:https://www.cnblogs.com/f1194361820/p/4741558.html 1)将远程仓库纳入管理 其实就是添加远程仓库,在你已有的本地仓库目录下执行如下命令: $ ...
- 打印html页面
// 打印类属性.方法定义 const Print = function (dom, options) { if (!(this instanceof Print)) return new Print ...
- MySQL常见问题集锦及注意事项
一.表设计上的坑 1.字段设计 1.1 字段类型设计 尽量使用整型表示字符串: `INET_ATON(str)`,address to number `INET_NTOA(number)`,numbe ...