BIT+(可持久化)权值线段树, 用到了BIT的差分技巧. 时间复杂度O(Nlog^2(N))

-----------------------------------------------------------------------------------------

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
#define H(x) (lower_bound(H, H + n, x) - H + 1)
#define lb(x) ((x) & -(x))
 
const int maxn = 50009;
 
int N, Q, Pos;
int H[maxn], n;
 
inline int getint() {
char c = getchar();
int ret = 0, f = 1;
for(; !isdigit(c); c = getchar()) if(c == '-') f = 0;
for(; isdigit(c); c = getchar()) ret = ret * 10 - '0' + c;
return f ? ret : -ret;
}
 
struct O {
int t, l, r, v;
inline void Read() {
t = getint(), l = getint(), r = getint(), v = getint();
}
} o[maxn];
 
struct Node {
Node *lc, *rc;
int v;
} pool[maxn * 400], *pt, *Null, *A[maxn], *B[maxn];
 
void Init_sgt() {
(pt = pool)->v = 0;
pt->lc = pt->rc = pt;
Null = pt++;
}
 
Node* Modify(Node* t, int l, int r, int ad) {
Node* p = pt++;
p->v = t->v + ad;
if(l != r) {
int m = (l + r) >> 1;
if(Pos <= m) {
p->lc = Modify(t->lc, l, m, ad);
p->rc = t->rc;
} else {
p->lc = t->lc;
p->rc = Modify(t->rc, m + 1, r, ad);
}
}
return p;
}
 
Node *L0[20], *L1[20], *L[20];
Node *R0[20], *R1[20];
 
void Work() {
Init_sgt();
int ln, rn, sn;
for(int i = 0; i <= N; i++) A[i] = B[i] = Null;
for(int i = 0; i < Q; i++) if(o[i].t == 1) {
Pos = H(o[i].v);
for(int x = o[i].l; x <= N; x += lb(x)) {
A[x] = Modify(A[x], 1, n, 1);
B[x] = Modify(B[x], 1, n, o[i].l - 1);
}
for(int x = o[i].r + 1; x <= N; x += lb(x)) {
A[x] = Modify(A[x], 1, n, -1);
B[x] = Modify(B[x], 1, n, -o[i].r);
}
} else {
ln = rn = sn = 0;
for(int x = o[i].l; x; x -= lb(x)) L[sn++] = A[x];
for(int x = o[i].l; x; x -= lb(x))
L0[ln] = A[x], R1[ln++] = B[x];
for(int x = o[i].r; x; x -= lb(x))
R0[rn] = A[x], L1[rn++] = B[x];
int l = 1, r = n, len = o[i].r - o[i].l + 1;
while(l < r) {
int m = (l + r) >> 1, cnt = 0;
for(int x = 0; x < sn; x++) cnt += L[x]->rc->v * len;
for(int x = 0; x < ln; x++)
cnt += R1[x]->rc->v - o[i].r * L0[x]->rc->v;
for(int x = 0; x < rn; x++)
cnt += o[i].r * R0[x]->rc->v - L1[x]->rc->v;
if(cnt >= o[i].v) {
for(int x = 0; x < sn; x++) L[x] = L[x]->rc;
for(int x = 0; x < ln; x++)
R1[x] = R1[x]->rc, L0[x] = L0[x]->rc;
for(int x = 0; x < rn; x++)
R0[x] = R0[x]->rc, L1[x] = L1[x]->rc;
l = m + 1;
} else {
o[i].v -= cnt;
for(int x = 0; x < sn; x++) L[x] = L[x]->lc;
for(int x = 0; x < ln; x++)
R1[x] = R1[x]->lc, L0[x] = L0[x]->lc;
for(int x = 0; x < rn; x++)
R0[x] = R0[x]->lc, L1[x] = L1[x]->lc;
r = m;
}
}
printf("%d\n", H[l - 1]);
}
}
 
void Init() {
N = getint(), Q = getint();
n = 0;
for(int i = 0; i < Q; i++) {
o[i].Read();
if(o[i].t == 1) H[n++] = o[i].v;
}
sort(H, H + n);
n = unique(H, H + n) - H;
}
 
int main() {
Init();
Work();
return 0;
}

-----------------------------------------------------------------------------------------

3110: [Zjoi2013]K大数查询

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 2921  Solved: 1247
[Submit][Status][Discuss]

Description

有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c
如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。

Input

第一行N,M
接下来M行,每行形如1 a b c或2 a b c

Output

输出每个询问的结果

Sample Input

2 5
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3

Sample Output

1
2
1

HINT

【样例说明】

第一个操作 后位置 1 的数只有 1 , 位置 2 的数也只有 1 。 第二个操作 后位置 1

的数有 1 、 2 ,位置 2 的数也有 1 、 2 。 第三次询问 位置 1 到位置 1 第 2 大的数 是

1 。 第四次询问 位置 1 到位置 1 第 1 大的数是 2 。 第五次询问 位置 1 到位置 2 第 3

大的数是 1 。‍

N,M<=50000,N,M<=50000

a<=b<=N

1操作中abs(c)<=N

2操作中abs(c)<=Maxlongint

Source

BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )的更多相关文章

  1. BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树

    [题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...

  2. BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树

    [题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...

  3. ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解

    题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...

  4. BZOJ 2141 排队(树状数组套主席树)

    解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...

  5. BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树

    BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...

  6. [COGS257]动态排名系统 树状数组套主席树

    257. 动态排名系统 时间限制:5 s   内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...

  7. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

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

    P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...

  9. 洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】

    题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> ...

  10. Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)

    E. Anton and Permutation time limit per test 4 seconds memory limit per test 512 megabytes input sta ...

随机推荐

  1. 如何用C#把Doc文档转换成rtf格式

    先在项目引用里添加上对Microsoft Word 9.0 object library的引用 using System; namespace DocConvert { class DoctoRtf ...

  2. Ubuntu Code::Blocks IDE 13.12 汉化

    Ubuntu Code::Blocks IDE 13.12 汉化: 安装很简单,不再赘述. 单说汉化: .下载中文简体汉化包(百度网盘):链接: http://pan.baidu.com/s/1kU3 ...

  3. vsftpd限制用户不能更改根目录

    在IE下登陆会出现如下图所示情况,当时直接吓尿了,尼玛这台危险了.仔细一想可定是在配置vsftpd.conf时没有设置用户不能更改根目录:

  4. css 里层元素撑不开外层元素

    一般是,里面那层做了高度设置,如:height, overflow等 另外可以让里面元素清楚浮动,如:clear:both

  5. Android 常用代码片小结

    1. dp px 相互转换---------------public class DensityUtil { /** * 根据手机的分辨率从 dip 的单位 转成为 px(像素) */ public ...

  6. 自学HTML5第四节(canvas画布详解)

    canvas画布好像可是说是HTML5的精华了,一定要学好,嗯嗯,绚丽的东西就要从基础的开始.... 先看看啥玩意叫做canvas 什么是 Canvas? HTML5 的 canvas 元素使用 Ja ...

  7. python 日期、时间戳转换

    获取当前日期: from datetime import datetime IN:datetime.now() OUT:datetime(2016,10,19,6,51,21,72341) 转化为字符 ...

  8. getchar()与EOF

    大师级经典的著作,要字斟句酌的去读,去理解.以前在看K&R的The C Programming Language(Second Edition)中第1.5节的字符输入/输出,很迷惑getcha ...

  9. centos下添加的端口不能访问(防火墙关闭)

    最近遇到一个郁闷的问题.好几天都没解决,求助,谢谢大家. 打算开放一个端口15900.可是无论怎么设置防火墙,或者干脆关闭防火墙.就是不能被外部机器访问(在同一内网网段机器). 本机访问没有问题(12 ...

  10. 对web应用中单一入口模式的理解及php实现

    在我们web应用的开发中,经常会听见或看见单一入口模式,在我开始学习tp框架的时候也不理解为什么要运用一个单一入口模式,只是会使用,最近自己在搞一个小东西的时候才明白为什么在web开发中要运用单一入口 ...