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
  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<algorithm>
  5. #include<cstring>
  6. #define ll long long
  7. using namespace std;
  8. int a,b,c;
  9. int n,m,sz;
  10. int root[];
  11. int ls[],rs[],sum[],lazy[];
  12. void pushdown(int k,int l,int r){
  13. if ((!lazy[k])||l==r) return;//如果没标记或者已经到了底层
  14. if (!ls[k])ls[k]=++sz;
  15. if (!rs[k])rs[k]=++sz;
  16. int mid=(l+r)>>;
  17. lazy[ls[k]]+=lazy[k];lazy[rs[k]]+=lazy[k];
  18. sum[ls[k]]+=(mid-l+)*lazy[k];
  19. sum[rs[k]]+=(r-mid)*lazy[k];
  20. lazy[k]=;
  21. }
  22.  
  23. void modify(int &k,int l,int r,int a,int b){
  24. if (!k)k=++sz;
  25. pushdown(k,l,r);
  26. if (a==l&&b==r){
  27. lazy[k]++;
  28. sum[k]+=(r-l+);
  29. return;
  30. }
  31. int mid=(l+r)>>;
  32. if (a>mid) modify(rs[k],mid+,r,a,b);
  33. else if (b<=mid) modify(ls[k],l,mid,a,b);
  34. else modify(ls[k],l,mid,a,mid),modify(rs[k],mid+,r,mid+,b);
  35. sum[k]=sum[ls[k]]+sum[rs[k]];
  36. }
  37.  
  38. void insert(){
  39. int l=,r=n,k=;
  40. while (l!=r){
  41. modify(root[k],,n,a,b);
  42. int mid=(l+r)>>;
  43. if (c>mid)l=mid+,k=k<<|;
  44. else r=mid,k=k<<;
  45. }
  46. modify(root[k],,n,a,b);
  47. }
  48.  
  49. int query(int k,int l,int r,int a,int b){
  50. if (!k) return ;
  51. pushdown(k,l,r);
  52. if (a==l&&b==r)return sum[k];
  53. int mid=(l+r)>>;
  54. if (a>mid) return query(rs[k],mid+,r,a,b);
  55. else if (b<=mid) return query(ls[k],l,mid,a,b);
  56. else return query(ls[k],l,mid,a,mid)+query(rs[k],mid+,r,mid+,b);
  57. }
  58.  
  59. int solve(){
  60. int l=,r=n,k=;
  61. while (l!=r){
  62. int t=query(root[k<<],,n,a,b);
  63. int mid=(l+r)>>;
  64. if (t>=c)r=mid,k=k<<;
  65. else l=mid+,k=k<<|,c-=t;
  66. }
  67. return l;
  68. }
  69.  
  70. int main(){
  71. freopen("sj.txt","r",stdin);
  72. freopen("me.txt","w",stdout);
  73. scanf("%d%d",&n,&m);
  74. for (int i=;i<=m;i++){
  75. int f;
  76. scanf("%d%d%d%d",&f,&a,&b,&c);
  77. if (f==)c=n-c+,insert();
  78. else printf("%d\n",n-solve()+);
  79. }
  80. }

【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. x264命令参数与代码中变量的对应关系

    帧类型选项:  -I/--keyint i_keyint_max 最大IDR帧间距,默认为250  -i/--min-keyint i_keyint_min 最小IDR帧间距,默认为25  --sce ...

  2. Codeforces Round #191 (Div. 2)

    在div 188中,幸运的达成了这学期的一个目标:CF1800+,所以这次可以打星去做div2,有点爽. A.Flipping Game 直接枚举 B. Hungry Sequence 由于素数的分布 ...

  3. css3 巧用结构性伪类选择器

    最近在国外的一个网站上看到的一个关于结构性伪类选择器的用法,觉得十分实用,就自己尝试了一下,并把它给记录下来: 这是最基本的样式: <style type="text/css" ...

  4. CSS3秘笈第三版涵盖HTML5学习笔记13~17章

    第13章,构建基于浮动的布局 使用的是float(浮动)属性 注:float:none值将取消所有浮动,通常只用来取消元素中已经应用的浮动. 切记:不需要给正文的div设计宽度,即使设计成固定宽度也不 ...

  5. 我的jquery之路

    不知不觉jquery已经看完了. 以前不知道jquery是什么,现在依然不是很清晰.或许学习的结果就是这样吧,忘记你所学的.

  6. Networking - ICMP 协议

    发送到远程计算机的数据通常发经过一个或多个路由器,这些路由器在把数据传输到最终目的地的过程中可能发生多种问题.路由器利用 ICMP 把问题通知给源 IP.ICMP 还有用于其他调试和排错的功能. IC ...

  7. 让无线网卡同时工作在 AP 和 STA 模式

    这个帖子里的方法有点过时了,不推荐继续使用. 有的时候会碰到这么一种情况,带着电脑和手机出去蹭网,无奈只有一个账号,手机上了电脑就没得用了,电脑用了手机就上不了网.如果能用电脑连接 Wifi 然后再开 ...

  8. Ajax之数据连接信息捕获

      connDB.properties: DB_CLASS_NAME=com.mysql.jdbc.Driver DB_URL=jdbc:mysql://127.0.0.1:3306/db_datab ...

  9. mvc Web api 如何在控制器中调用

    关于如何调用 mvc Web api 的方法,网上一搜就是一大把,基本都是在前台jq中调用的,但是如何在后台调用呢? 本楼主做了一下测试,仅供参考. 先写一个简单的api,如下:[域1] namesp ...

  10. css3学习笔记之用户界面

    CSS3 调整尺寸(Resizing) CSS3中,resize属性指定一个元素是否应该由用户去调整大小. 这个 div 元素由用户调整大小. (在 Firefox 4+, Chrome, 和 Saf ...