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. iOS多线程编程指南(一)关于多线程编程(转)

    原文:http://www.dreamingwish.com/article/ios-multi-threaded-programming-a-multi-threaded-programming.h ...

  2. linux下创建可引导的U盘系统,使用dd命令进行Linux的ghost

    1,通过iso创建可引导的U盘系统. 1.0,格式化U盘为FAT32格式 linux下能够使用命令: mkfs.vfat U盘的设备路径 比如: mkfs.vfat /dev/sdb 当中U盘的路径能 ...

  3. js——cookie

    cookie:存储数据,当用户访问了某个网站(网页)的时候,我们就可以通过cookie来向访问者电脑上存储数据 1.不同的浏览器存放的cookie位置不一样,也是不能通用的 2. cookie的存储是 ...

  4. 转:IIS请求筛选模块被配置为拒绝超过请求内容长度的请求

    HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大 ...

  5. cookie简介

    上例子 1.首先要用php创建cookie发送给客户端,利用setcookie()方法即可 <?php /* * * @Authors peng--jun * @Email 1098325951 ...

  6. 3D空间坐标系转换复习

    模型坐标系:ModelSpace     即模型本身为中心  模型本身自己 世界坐标系:WorldSpace    世界坐标系   整个世界 视角坐标系: ViewSpace       眼睛看到的范 ...

  7. C++静态库与动态库(简介)

    C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...

  8. MarkWord

    MarkWord - 可发布博客的 Markdown编辑器 代码开源 1 /// <summary> 2 /// 同步呈现 3 /// </summary> 4 /// < ...

  9. 关于Linux Kernel 2.6.28 以上有缺陷,在第208.5天自行重啟的问题

        今天看到一转帖如下: Linux Kernel 2.6.28 以上有缺陷,在第208.5天自行重啟 https://access.redhat.com/knowledge/solutions/ ...

  10. 【Windows 8 Store App】学习三:HTTP

    原文 http://www.cnblogs.com/java-koma/archive/2013/05/22/3093309.html 1,HttpClient Win 8提供了System.Net. ...