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

一直不是很理解树套树是个什么鬼。
题解告诉我此题为线段树套线段树。一维维护权值,二维维护区间。
精髓还没有领悟到,果真我还是很弱QWQ
 #include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
int a,b,c;
int n,m,sz;
int root[];
int ls[],rs[],sum[],lazy[];
void pushdown(int k,int l,int r){
if ((!lazy[k])||l==r) return;//如果没标记或者已经到了底层
if (!ls[k])ls[k]=++sz;
if (!rs[k])rs[k]=++sz;
int mid=(l+r)>>;
lazy[ls[k]]+=lazy[k];lazy[rs[k]]+=lazy[k];
sum[ls[k]]+=(mid-l+)*lazy[k];
sum[rs[k]]+=(r-mid)*lazy[k];
lazy[k]=;
} void modify(int &k,int l,int r,int a,int b){
if (!k)k=++sz;
pushdown(k,l,r);
if (a==l&&b==r){
lazy[k]++;
sum[k]+=(r-l+);
return;
}
int mid=(l+r)>>;
if (a>mid) modify(rs[k],mid+,r,a,b);
else if (b<=mid) modify(ls[k],l,mid,a,b);
else modify(ls[k],l,mid,a,mid),modify(rs[k],mid+,r,mid+,b);
sum[k]=sum[ls[k]]+sum[rs[k]];
} void insert(){
int l=,r=n,k=;
while (l!=r){
modify(root[k],,n,a,b);
int mid=(l+r)>>;
if (c>mid)l=mid+,k=k<<|;
else r=mid,k=k<<;
}
modify(root[k],,n,a,b);
} int query(int k,int l,int r,int a,int b){
if (!k) return ;
pushdown(k,l,r);
if (a==l&&b==r)return sum[k];
int mid=(l+r)>>;
if (a>mid) return query(rs[k],mid+,r,a,b);
else if (b<=mid) return query(ls[k],l,mid,a,b);
else return query(ls[k],l,mid,a,mid)+query(rs[k],mid+,r,mid+,b);
} int solve(){
int l=,r=n,k=;
while (l!=r){
int t=query(root[k<<],,n,a,b);
int mid=(l+r)>>;
if (t>=c)r=mid,k=k<<;
else l=mid+,k=k<<|,c-=t;
}
return l;
} int main(){
freopen("sj.txt","r",stdin);
freopen("me.txt","w",stdout);
scanf("%d%d",&n,&m);
for (int i=;i<=m;i++){
int f;
scanf("%d%d%d%d",&f,&a,&b,&c);
if (f==)c=n-c+,insert();
else printf("%d\n",n-solve()+);
}
}

【bzoj3110】[Zjoi2013]K大数查询的更多相关文章

  1. BZOJ3110[Zjoi2013]K大数查询(树状数组+整体二分)

    3110 [Zjoi2013]K大数查询 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a ...

  2. BZOJ3110 [Zjoi2013]K大数查询 树套树 线段树 整体二分 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3110 题意概括 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位 ...

  3. BZOJ3110: [Zjoi2013]K大数查询

    喜闻乐见的简单树套树= =第一维按权值建树状数组,第二维按下标建动态开点线段树,修改相当于第二维区间加,查询在树状数组上二分,比一般的线段树还短= =可惜并不能跑过整体二分= =另外bzoj上的数据有 ...

  4. [BZOJ3110][ZJOI2013]K大数查询(整体二分)

    BZOJ Luogu sol 整体二分,其实很简单的啦. 对所有询问二分一个答案mid,把所有修改操作中数字大于mid的做一个区间覆盖(区间加1) 查询就是区间查询 然后左右分一分即可 注意是第k大 ...

  5. BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树

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

  6. bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】

    //========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/  转载要声明! //=============== ...

  7. bzoj3110 [Zjoi2013]K大数查询——线段树套线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3110 外层权值线段树套内层区间线段树: 之所以外层权值内层区间,是因为区间线段树需要标记下传 ...

  8. bzoj3110: [Zjoi2013]K大数查询 【cdq分治&树套树】

    模板题,折腾了许久. cqd分治整体二分,感觉像是把询问分到答案上. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = ...

  9. BZOJ3110:[ZJOI2013]K大数查询(整体二分)

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

  10. 【树套树】bzoj3110 [Zjoi2013]K大数查询

    题解很多,实现起来以外地简洁.内层的区间线段树上用了标记永久化. #include<cstdio> using namespace std; #define N 50001 struct ...

随机推荐

  1. hdu 4606 简单计算几何+floyd+最小路径覆盖

    思路:将所有的直线的两个端点和城市混在一起,将能直接到达的两个点连线,求一次floyd最短路径.二分枚举bag容量,然后按给的要先后占领的城市由前向后,把能到一步到达的建一条边.然后求一次最小路径覆盖 ...

  2. 解决python 提示 SyntaxError: Missing parentheses in call to 'print'

    刚刚学习python,练习他的输出,发现输出一个常量时报错了,如下: 发现是因为python2.X版本与python3.X版本输出方式不同造成的在python3.X的,输入内容时都要带上括号pytho ...

  3. Jquery Easyui验证扩展,Easyui验证,Easyui校验,js正则表达式

    Jquery Easyui验证扩展,Easyui验证,Easyui校验,js正则表达式 >>>>>>>>>>>>>> ...

  4. VS中的波浪线

    绿色波浪线: 如果你的代码中出现了绿色的波浪线,说明你的代码语法并没有错误, 只不过提示你有可能会出现错误,但是不一定会出现错误.警告线 红色波浪线: 如果你的代码中出现了红色的波浪线,意味着你的代码 ...

  5. 面试之SQL(2)--left join, inner join 和 right join的区别

    表A记录如下: aID        aName 1           a1 2           a2 3           a3 4           a4 5           a5 ...

  6. HDOJ2026首字母变大写

    首字母变大写 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  7. js cookie使用方法详解

    代码如下 复制代码 <script>function getCookie(c_name){ if (document.cookie.length>0){ //先查询cookie是否为 ...

  8. Java垃圾回收介绍(译)

    在Java中,对象内存空间的分配与回收是由JVM中的垃圾回收进程自动完成的.与C语言不同的是,在Java中开发者不需要专门为垃圾回收写代码.这是使Java流行的众多特征之一,也帮助了程序员写出了更好的 ...

  9. Java Thread UncaughtExceptionHandler

    有没有发生过这样的情况,你写的工作线程莫名其妙的挂了,如果不是被你刚好看到,拿只能抓瞎了,不知道啥原因了,因为异常的时候只会把stack trace打在控制台上,不会记在你想记得错误日志里,头皮都抓破 ...

  10. C#核心语法

    目录 1. 特殊的数据成员........................................................................... 1 2. 数组(arr ...