题面

luogu

题解

2019年AC的第一道题~~

函数名命名为rank竟然会ce

我写的是树状数组套值域线段树(动态开点)

操作1:询问\(k\)在\([l-r]\)这段区间有多少数比它小,再加\(1\)

操作2:前缀和思想得到\([l-r]\)区间的线段树,然后类似平衡树找第\(k\)大

操作3:直接修改

操作4/5:操作1+操作2

Code

#include<bits/stdc++.h>

#define LL long long
#define RG register const int N = 50010; using namespace std; inline int gi() {
RG int x = 0; RG char c = getchar(); bool f = 0;
while (c != '-' && (c < '0' || c > '9')) c = getchar();
if (c == '-') c = getchar(), f = 1;
while (c >= '0' && c <= '9') x = x*10+c-'0', c = getchar();
return f ? -x : x;
} int tot, A[N<<1], a[N], cnt, n;
int t1, t2, tmp1[N], tmp2[N]; struct question {
int op, l, r, k;
}q[N]; struct node {
int ls, rs, v;
}t[N<<7];
int rt[N];
#define lowbit(x) (x&(-x))
void Update(int &now, int l, int r, int pos, int k) {
if (!now) now = ++cnt;
t[now].v += k;
if (l == r) return ;
int mid = (l + r) >> 1;
if (pos <= mid) Update(t[now].ls, l, mid, pos, k);
else Update(t[now].rs, mid+1, r, pos, k);
}
void update(int x, int k) {
for (int i = x; i <= n; i += lowbit(i)) Update(rt[i], 1, tot, a[x], k);
}
int query(int now, int l, int r, int pos) {
if (l == r) return t[now].v;
int mid = (l + r) >> 1;
if (pos <= mid) return query(t[now].ls, l, mid, pos);
return t[t[now].ls].v+query(t[now].rs, mid+1, r, pos);
} int Rank(int l, int r, int k) {
if (l > r) return 0;
l--;
int s = 0;
for (int i = r; i; i -= lowbit(i)) s += query(rt[i], 1, tot, k);
for (int i = l; i; i -= lowbit(i)) s -= query(rt[i], 1, tot, k);
return s;
} int Kth(int l, int r, int k) {
if (l == r) return l;
int mid = (l + r) >> 1, s = 0;
for (int i = 1; i <= t1; i++) s += t[t[tmp1[i]].ls].v;
for (int i = 1; i <= t2; i++) s -= t[t[tmp2[i]].ls].v;
if (s >= k) {
for (int i = 1; i <= t1; i++) tmp1[i] = t[tmp1[i]].ls;
for (int i = 1; i <= t2; i++) tmp2[i] = t[tmp2[i]].ls;
return Kth(l, mid, k);
}
else {
for (int i = 1; i <= t1; i++) tmp1[i] = t[tmp1[i]].rs;
for (int i = 1; i <= t2; i++) tmp2[i] = t[tmp2[i]].rs;
return Kth(mid+1, r, k-s);
}
} int kth(int l, int r, int k) {
l--; t1 = t2 = 0;
for (int i = r; i; i -= lowbit(i)) tmp1[++t1] = rt[i];
for (int i = l; i; i -= lowbit(i)) tmp2[++t2] = rt[i];
return A[Kth(1, tot, k)];
} int main() {
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
n = gi();
int m = gi();
for (int i = 1; i <= n; i++) A[++tot] = a[i] = gi();
for (int i = 1; i <= m; i++) {
q[i].op = gi();
if (q[i].op != 3) {
q[i].l = gi(); q[i].r = gi(); q[i].k = gi();
if (q[i].op != 2) A[++tot] = q[i].k;
}
else {
q[i].l = q[i].r = gi();
A[++tot] = q[i].k = gi();
}
}
sort(A+1, A+1+tot);
tot = unique(A+1, A+1+tot) - A - 1;
for (int i = 1; i <= n; i++) a[i] = lower_bound(A+1, A+1+tot, a[i])-A;
for (int i = 1; i <= n; i++) update(i, 1);
for (int i = 1; i <= m; i++)
if (q[i].op != 2)
q[i].k = lower_bound(A+1, A+1+tot, q[i].k)-A;
for (int i = 1; i <= m; i++) {
if (q[i].op == 1)
printf("%d\n", Rank(q[i].l, q[i].r, q[i].k-1)+1);
else if (q[i].op == 2) printf("%d\n", kth(q[i].l, q[i].r, q[i].k));
else if (q[i].op == 3) {
update(q[i].l, -1);
a[q[i].l] = q[i].k;
update(q[i].l, 1);
}
else if (q[i].op == 4) {
int g = Rank(q[i].l, q[i].r, q[i].k-1);
if (!g) puts("-2147483647");
else printf("%d\n", kth(q[i].l, q[i].r, g));
}
else {
int g = Rank(q[i].l, q[i].r, q[i].k);
if (g == q[i].r-q[i].l+1) puts("2147483647");
else printf("%d\n", kth(q[i].l, q[i].r, g+1));
}
}
return 0;
}

洛谷 P3380 【模板】二逼平衡树(树套树)的更多相关文章

  1. BZOJ3196 & 洛谷3380:二逼平衡树——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3196 https://www.luogu.org/problemnew/show/P3380 (题 ...

  2. bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1807  Solved: 772[Submit][Stat ...

  3. bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description ...

  4. BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)

    我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...

  5. BZOJ3196 二逼平衡树 【线段树套平衡树】

    题目 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查询k在区间内的前驱(前驱 ...

  6. BZOJ 3196 Tyvj 1730 二逼平衡树:线段树套splay

    传送门 题意 给你一个长度为 $ n $ 有序数列 $ a $ ,进行 $ m $ 次操作,操作有如下几种: 查询 $ k $ 在区间 $ [l,r] $ 内的排名 查询区间 $ [l,r] $ 内排 ...

  7. 洛谷.3835.[模板]可持久化平衡树(fhq treap)

    题目链接 对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样).时间空间复杂度都为O(qlogq).(应该更大些 因为rand()?内存真的爆炸..) 对于无修改的操作实际上 ...

  8. bzoj 3196 Tyvj 1730 二逼平衡树【线段树 套 splay】

    四舍五入就是个暴力. 对于线段树的每个区间都开一棵按权值排序的splay 对于第二个操作,二分一下,每次查询mid的排名,复杂度 $ O(nlog(n)^{3}) $ 其余的操作都是$ O(nlog( ...

  9. [BZOJ3196] [Tyvj1730] 二逼平衡树(线段树 套 Splay)

    传送门 至少BZOJ过了,其他的直接弃. 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的 ...

  10. 洛谷P3380 【模板】二逼平衡树(树套树)(线段树+树状数组)

    P3380 [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数 ...

随机推荐

  1. 常用Xcode文档位置,修改Xcode项目模板地址总结,以及常用地址,随时更新。

    Xcode文档 ~/Library/Developer/Shared/Documentation/DocSets or /Applications/Xcode.app/Contents/Develop ...

  2. [原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式

    我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ------> 从左边图转换成右边图,像这种需求,我们难免 ...

  3. Luogu 4284 [SHOI2014]概率充电器

    BZOJ 3566 树形$dp$ + 概率期望. 每一个点的贡献都是$1$,在本题中期望就等于概率. 发现每一个点要通电会在下面三件事中至少发生一件: 1.它自己通电了. 2.它的父亲给它通电了. 3 ...

  4. oracle 序列初始化的plsql块脚本

    declare seq_name dba_sequences.SEQUENCE_NAME%TYPE; cursor mycur is select * from dba_sequences where ...

  5. ESP8266-iot-2

    1.SDK概述 复制相关的工程文件到HelloWorld里面 要在版本esp8266_nonos_sdk_v2.0.0_16_07_19上面开发,那么就要复制相应文件 然后打开IDE 导入HelloW ...

  6. SVN下载地址及注意事项

    SVN下载地址:VisualSVN:http://www.visualsvn.com/server/download     服务器端(添加仓库和用户)TortoiseSVN:http://torto ...

  7. C++面试基础

    自己整理了一些常见的面试题,频率挺高的都是,而且感觉这里这些基础的东西都会问,自己过几天也要面试了,所以发上来让大家一起看看,有什么错误的地方望提醒我纠正. 32位数据类型以及sizeof大小. ch ...

  8. css总结12:CSS Float(浮动)

    1 定义:CSS 的 Float(浮动),会使元素向左或向右移动,其周围的元素也会重新排列. 2 解释:浮动的元素,浮在界面上,脱离了HTML文本流. 元素的水平方向浮动,意味着元素只能左右移动而不能 ...

  9. 史融资2.5亿的“自主国产”红芯浏览器,其实是个套壳Chrome

    红芯浏览器 今天早上看到朋友发的浏览器图片,感觉很好奇,然后就看了下,感觉文章还不错,就转发了下,然后下载浏览器着实花了不小心思,最后文末添加了红芯浏览器转存在蓝奏云盘的下载连接了. 文章原文 今天又 ...

  10. delphi xe6 for android 自带控件LocationSensor优先使用GPS定位的方法

    delphi xe6 for android LocationSensor控件默认是优先使用网络定位,对定位精度要求高的应用我们可以修改原码直接指定GPS定位. 修改方法: 将C:\Program F ...