题目链接 BZOJ

洛谷


整体二分求的是第K小(利用树状数组)。求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\)。

注意到所有数的绝对值\(\leq N\),将所有数的大小关系反过来 第\(K\)大就是第\(K\)小了。所有数\(A[i]\)改为\(n-A[i]\),输出的时候也改为\(n-Ans[i]\)。

区间加入一个数\(C\)可以直接用线段树区间加,也可以树状数组维护常数会小很多。

\(n*m=2.5*1e9 > MAX\_INT\) 也是没谁了。。

现学了一波树状数组区间修改区间查询...->见这里

洛谷Rank1在BZOJ上60多。。


树状数组:

  1. //4976KB 1220MS
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. #define lb(x) (x&-x)
  6. //#define gc() getchar()
  7. #define MAXIN 50000
  8. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  9. typedef long long LL;
  10. const int N=50005;
  11. int n,m,A[N],Ans[N];
  12. char IN[MAXIN],*SS=IN,*TT=IN;
  13. struct Operation
  14. {
  15. LL K; int l,r,pos;//K!=0:Query [l,r] K; K=0:Add [l,r] pos.
  16. Operation() {}
  17. Operation(LL K,int l,int r,int p):K(K),l(l),r(r),pos(p) {}
  18. }q[N],q1[N],q2[N];
  19. inline int read()
  20. {
  21. int now=0,f=1;register char c=gc();
  22. for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
  23. for(;isdigit(c);now=now*10+c-'0',c=gc());
  24. return now*f;
  25. }
  26. inline LL readll()
  27. {
  28. LL now=0,f=1;register char c=gc();
  29. for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
  30. for(;isdigit(c);now=now*10+c-'0',c=gc());
  31. return now*f;
  32. }
  33. namespace T
  34. {
  35. int n;
  36. LL sum1[N],sum2[N];
  37. inline void Modify(int p,int v)
  38. {
  39. for(int i=p; i<=n; i+=lb(i))
  40. sum1[i]+=v, sum2[i]+=p*v;
  41. }
  42. inline void Modify_Range(int l,int r,int v){
  43. Modify(l,v), Modify(r+1,-v);
  44. }
  45. inline LL Query(int p)
  46. {
  47. LL res1=0,res2=0;
  48. for(int i=p; i; i^=lb(i))
  49. res1+=sum1[i], res2+=sum2[i];
  50. return res1*(p+1)-res2;
  51. }
  52. inline LL Query_Range(int l,int r){
  53. return Query(r)-Query(l-1);
  54. }
  55. }
  56. void Solve(int l,int r,int h,int t)
  57. {
  58. if(h>t) return;
  59. if(l==r){
  60. for(int i=h; i<=t; ++i) if(q[i].K) Ans[q[i].pos]=l;
  61. return;
  62. }
  63. bool goon=0;//无询问时直接return。
  64. for(int i=h; i<=t; ++i) if(q[i].K) {goon=1; break;}
  65. if(!goon) return;
  66. int mid=l+r>>1, t1=0, t2=0;
  67. for(int i=h; i<=t; ++i)
  68. if(q[i].K)
  69. {
  70. LL tmp=T::Query_Range(q[i].l,q[i].r);
  71. if(tmp>=q[i].K) q1[t1++]=q[i];
  72. else q[i].K-=tmp, q2[t2++]=q[i];
  73. }
  74. else
  75. {
  76. if(q[i].pos<=mid) T::Modify_Range(q[i].l,q[i].r,1), q1[t1++]=q[i];
  77. else q2[t2++]=q[i];
  78. }
  79. for(int i=0; i<t1; ++i) if(!q1[i].K) T::Modify_Range(q1[i].l,q1[i].r,-1);//q1→_→
  80. for(int i=0; i<t1; ++i) q[h+i]=q1[i];
  81. for(int i=0; i<t2; ++i) q[h+t1+i]=q2[i];
  82. Solve(l,mid,h,h+t1-1), Solve(mid+1,r,h+t1,t);
  83. }
  84. int main()
  85. {
  86. T::n=n=read(), m=read(); int tot=0;
  87. for(int l,r,i=1; i<=m; ++i)
  88. if(read()==1) l=read(), r=read(), q[i]=Operation(0,l,r,n-read());
  89. else l=read(), r=read(), q[i]=Operation(readll(),l,r,++tot);
  90. Solve(-N,N,1,m);
  91. for(int i=1; i<=tot; ++i) printf("%d\n",n-Ans[i]);
  92. return 0;
  93. }

线段树:(常数大的一匹)

  1. //7320kb 6064ms
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. //#define gc() getchar()
  6. #define MAXIN 50000
  7. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  8. typedef long long LL;
  9. const int N=50005;
  10. int n,m,A[N],Ans[N];
  11. char IN[MAXIN],*SS=IN,*TT=IN;
  12. struct Operation
  13. {
  14. LL K; int l,r,pos;//K!=0:Query [l,r] K; K=0:Add [l,r] pos.
  15. Operation() {}
  16. Operation(LL K,int l,int r,int p):K(K),l(l),r(r),pos(p) {}
  17. }q[N],q1[N],q2[N];
  18. inline int read()
  19. {
  20. int now=0,f=1;register char c=gc();
  21. for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
  22. for(;isdigit(c);now=now*10+c-'0',c=gc());
  23. return now*f;
  24. }
  25. inline LL readll()
  26. {
  27. LL now=0,f=1;register char c=gc();
  28. for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
  29. for(;isdigit(c);now=now*10+c-'0',c=gc());
  30. return now*f;
  31. }
  32. namespace T
  33. {
  34. #define lson rt<<1
  35. #define rson rt<<1|1
  36. #define ToL l,m,rt<<1
  37. #define ToR m+1,r,rt<<1|1
  38. LL sum[N<<2],tag[N<<2];
  39. inline void Update(int rt){
  40. sum[rt]=sum[lson]+sum[rson];
  41. }
  42. inline void PushDown(int rt,LL m)//long long!
  43. {
  44. tag[lson]+=tag[rt], tag[rson]+=tag[rt];
  45. sum[lson]+=tag[rt]*(m-(m>>1)), sum[rson]+=tag[rt]*(m>>1);
  46. tag[rt]=0;
  47. }
  48. void Modify(int l,int r,int rt,int L,int R,int v)
  49. {
  50. if(L<=l && r<=R)
  51. tag[rt]+=v, sum[rt]+=1ll*(r-l+1)*v;
  52. else
  53. {
  54. if(tag[rt]) PushDown(rt,r-l+1);
  55. int m=l+r>>1;
  56. if(L<=m) Modify(ToL,L,R,v);
  57. if(m<R) Modify(ToR,L,R,v);
  58. Update(rt);
  59. }
  60. }
  61. LL Query(int l,int r,int rt,int L,int R)
  62. {
  63. if(L<=l && r<=R) return sum[rt];
  64. if(tag[rt]) PushDown(rt,r-l+1);
  65. int m=l+r>>1;
  66. if(L<=m)
  67. if(m<R) return Query(ToL,L,R)+Query(ToR,L,R);
  68. else return Query(ToL,L,R);
  69. return Query(ToR,L,R);
  70. }
  71. }
  72. void Solve(int l,int r,int h,int t)
  73. {
  74. if(h>t) return;
  75. if(l==r){
  76. for(int i=h; i<=t; ++i) if(q[i].K) Ans[q[i].pos]=l;
  77. return;
  78. }
  79. bool goon=0;//无询问时直接return。
  80. for(int i=h; i<=t; ++i) if(q[i].K) {goon=1; break;}
  81. if(!goon) return;
  82. int mid=l+r>>1, t1=0, t2=0;
  83. for(int i=h; i<=t; ++i)
  84. if(q[i].K)
  85. {
  86. LL tmp=T::Query(1,n,1,q[i].l,q[i].r);
  87. if(tmp>=q[i].K) q1[t1++]=q[i];
  88. else q[i].K-=tmp, q2[t2++]=q[i];
  89. }
  90. else
  91. {
  92. if(q[i].pos<=mid) T::Modify(1,n,1,q[i].l,q[i].r,1), q1[t1++]=q[i];
  93. else q2[t2++]=q[i];
  94. }
  95. for(int i=0; i<t1; ++i) if(!q1[i].K) T::Modify(1,n,1,q1[i].l,q1[i].r,-1);//q1→_→
  96. for(int i=0; i<t1; ++i) q[h+i]=q1[i];
  97. for(int i=0; i<t2; ++i) q[h+t1+i]=q2[i];
  98. Solve(l,mid,h,h+t1-1), Solve(mid+1,r,h+t1,t);
  99. }
  100. int main()
  101. {
  102. n=read(), m=read(); int tot=0;
  103. for(int l,r,i=1; i<=m; ++i)
  104. if(read()==1) l=read(), r=read(), q[i]=Operation(0,l,r,n-read());
  105. else l=read(), r=read(), q[i]=Operation(readll(),l,r,++tot);
  106. Solve(-N,N,1,m);
  107. for(int i=1; i<=tot; ++i) printf("%d\n",n-Ans[i]);
  108. return 0;
  109. }

线段树 标记永久化:WA了,不知道该怎么着。。(应该没问题啊)

  1. //标记永久化替代PushDown可以减小常数,但是怎么不对exm?
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. #define gc() getchar()
  6. //#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  7. typedef long long LL;
  8. const int N=50005;
  9. int n,m,A[N],Ans[N];
  10. struct Operation
  11. {
  12. LL K; int l,r,pos;//K!=0:Query [l,r] K; K=0:Add [l,r] pos.
  13. Operation() {}
  14. Operation(LL K,int l,int r,int p):K(K),l(l),r(r),pos(p) {}
  15. }q[N],q1[N],q2[N];
  16. inline int read()
  17. {
  18. int now=0,f=1;register char c=gc();
  19. for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
  20. for(;isdigit(c);now=now*10+c-'0',c=gc());
  21. return now*f;
  22. }
  23. inline LL readll()
  24. {
  25. LL now=0,f=1;register char c=gc();
  26. for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
  27. for(;isdigit(c);now=now*10+c-'0',c=gc());
  28. return now*f;
  29. }
  30. namespace T
  31. {
  32. #define lson rt<<1
  33. #define rson rt<<1|1
  34. #define ToL l,m,rt<<1
  35. #define ToR m+1,r,rt<<1|1
  36. LL sum[N<<2],all[N<<2];
  37. void Modify(int l,int r,int rt,int L,int R,int v)
  38. {
  39. sum[rt]+=1ll*v*(R-L+1);
  40. if(L<=l && r<=R) all[rt]+=v;
  41. else
  42. {
  43. int m=l+r>>1;
  44. if(L<=m) Modify(ToL,L,m,v);
  45. if(m<R) Modify(ToR,m+1,R,v);
  46. }
  47. }
  48. LL Query(int l,int r,int rt,int L,int R)
  49. {
  50. if(L<=l && r<=R) return sum[rt];
  51. int m=l+r>>1;
  52. if(L<=m)
  53. if(m<R) return 1ll*all[rt]*(R-L+1)+Query(ToL,L,R)+Query(ToR,L,R);
  54. else return 1ll*all[rt]*(R-L+1)+Query(ToL,L,R);
  55. return 1ll*all[rt]*(R-L+1)+Query(ToR,L,R);
  56. }
  57. }
  58. void Solve(int l,int r,int h,int t)
  59. {
  60. if(h>t) return;
  61. if(l==r){
  62. for(int i=h; i<=t; ++i) if(q[i].K) Ans[q[i].pos]=l;
  63. return;
  64. }
  65. bool goon=0;//无询问时直接return。
  66. for(int i=h; i<=t; ++i) if(q[i].K) {goon=1; break;}
  67. if(!goon) return;
  68. int mid=l+r>>1, t1=0, t2=0;
  69. for(int i=h; i<=t; ++i)
  70. if(q[i].K)
  71. {
  72. LL tmp=T::Query(1,n,1,q[i].l,q[i].r);
  73. if(tmp>=q[i].K) q1[t1++]=q[i];
  74. else q[i].K-=tmp, q2[t2++]=q[i];
  75. }
  76. else
  77. {
  78. if(q[i].pos<=mid) T::Modify(1,n,1,q[i].l,q[i].r,1), q1[t1++]=q[i];
  79. else q2[t2++]=q[i];
  80. }
  81. for(int i=0; i<t1; ++i) if(!q1[i].K) T::Modify(1,n,1,q1[i].l,q1[i].r,-1);//q1
  82. for(int i=0; i<t1; ++i) q[h+i]=q1[i];
  83. for(int i=0; i<t2; ++i) q[h+t1+i]=q2[i];
  84. Solve(l,mid,h,h+t1-1), Solve(mid+1,r,h+t1,t);
  85. }
  86. int main()
  87. {
  88. n=read(), m=read(); int tot=0;
  89. for(int l,r,i=1; i<=m; ++i)
  90. if(read()==1) l=read(), r=read(), q[i]=Operation(0,l,r,n-read());
  91. else l=read(), r=read(), q[i]=Operation(readll(),l,r,++tot);
  92. Solve(-N,N,1,m);
  93. for(int i=1; i<=tot; ++i) printf("%d\n",n-Ans[i]);
  94. return 0;
  95. }

BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)的更多相关文章

  1. BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]

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

  2. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

  3. BZOJ 3110 [ZJOI2013]K大数查询 (整体二分+线段树)

    和dynamic rankings这道题的思想一样 只不过是把树状数组换成线段树区间修改,求第$K$大的而不是第$K$小的 这道题还有负数,需要离散 #include <vector> # ...

  4. BZOJ 3110 [Zjoi2013]K大数查询(整体二分)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 11654  Solved: 3505[Submit][St ...

  5. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  6. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  7. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  8. BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )

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

  9. BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec   Memory Limit: 512 MB Submit: 418   Solved: 235 [ Submit][ ...

随机推荐

  1. webSQL 增删改查

    webSQL 增删改查  转载于:https://www.cnblogs.com/liuhao-web/p/7866032.html /** *数据库操作辅助类,定义对象.数据操作方法都在这里定义 * ...

  2. imperva 更改web界面的密码

    通过SSH作为用户根登录到MX(或通过另一个用户并提升) 运行命令“su oracle” //首先切换到oracle用户 sqlplus secure/(密码)   /用此命令登录到数据库     s ...

  3. Linux学习笔记-Linux系统简介

    Linux学习笔记-Linux系统简介 UNIX与Linux发展史 UNIX是父亲,Linux是儿子. UNIX发行版本 操作系统 公司 硬件平台 AIX IBM PowerPC HP-UX HP P ...

  4. Flask:静态文件&模板(0.1)

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 前面看了Flask的Quickstart文档,可是,一直没有练习里面的内容,这不,刚刚练习完毕,来写篇博文记录一下! ...

  5. 分别使用docx4j,jacob将文字与图片插入word中书签位置

    项目中需要将一段文字,与人员的签名(图片)插入到上传的word中,上网查询了一下,有许多种方式可以向word中插入文字,发现docx4j与jacob都为比较常见的解决方案,于是就先使用的docx4j进 ...

  6. numpy数学计算

    1.求范数 np.linalg.norm norm(x, ord=None, axis=None, keepdims=False)  范数理论的一个小推论告诉我们:ℓ1≥ℓ2≥ℓ∞

  7. 2016-2017-2 20155309南皓芯《java程序设计》第七周学习总结

    教材学习内容总结 Lambda 一种匿名方法 表达式构成 括号以及括号里用逗号分隔的参数列表 仅有一个参数的可以省略括号 ->符号 花括号以及花括号里的语句 仅有一条语句时可以省略花括号,并且这 ...

  8. MP3 Fuzz学习

    这篇文章主要是学习一波MP3格式fuzz的知识.目录如下 0x0.MP3格式的构成 0x0.MP3格式的构成 MP3是一种通俗叫法,学名叫MPEG1 Layer-3.MP3是三段式的结构,依次由ID3 ...

  9. win7下scheme环境配置

    运行lisp方言--scheme,在windows下,用eclipse. 1.eclipse装好 2.eclipse安装插件scheme48 development took, http://www. ...

  10. Spark介绍及安装部署

    一.Spark介绍 1.1 Apache Spark Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架(没有数据存储).最初在2009年由加州大学伯克利分校的AMPLab开 ...