分块 或 树套树。

在每个块中维护一个有序表,查询时各种二分,全都是分块的经典操作,就不详细说了。

块的大小定为sqrt(n*log2(n))比较快。

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. int sum,sz,l[],r[],num[],a[],b[],x,y,k,n,m,op,tmp[];
  7. void makeblock()
  8. {
  9. memcpy(b,a,sizeof(a));
  10. sz=sqrt((double)n*log2(n));
  11. for(sum=;sum*sz<n;sum++)
  12. {
  13. l[sum]=(sum-)*sz+;
  14. r[sum]=sum*sz;
  15. for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
  16. sort(b+l[sum],b+r[sum]+);
  17. }
  18. l[sum]=sz*(sum-)+; r[sum]=n;
  19. for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
  20. }
  21. inline void Update()
  22. {
  23. *lower_bound(b+l[num[x]],b+r[num[x]]+,a[x])=y;
  24. sort(b+l[num[x]],b+r[num[x]]+);
  25. a[x]=y;
  26. }
  27. inline void Rank()
  28. {
  29. int ans=;
  30. if(num[x]+>=num[y]) {for(int i=x;i<=y;i++) if(a[i]<k) ans++;}
  31. else
  32. {
  33. for(int i=x;i<=r[num[x]];i++) if(a[i]<k) ans++;
  34. for(int i=l[num[y]];i<=y;i++) if(a[i]<k) ans++;
  35. for(int i=num[x]+;i<num[y];i++) ans+=lower_bound(b+l[i],b+r[i]+,k)-(b+l[i]);
  36. }
  37. printf("%d\n",ans+);
  38. }
  39. inline void Kth()
  40. {
  41. if(num[x]+>=num[y])
  42. {
  43. int en=;
  44. for(int i=x;i<=y;i++) tmp[++en]=a[i];
  45. sort(tmp+,tmp+en+);
  46. printf("%d\n",tmp[k]);
  47. }
  48. else
  49. {
  50. int L=,R=;
  51. while(L!=R)
  52. {
  53. int mid=L+R>>,cnt=;
  54. for(int i=x;i<=r[num[x]];i++) if(a[i]<mid) cnt++;
  55. for(int i=l[num[y]];i<=y;i++) if(a[i]<mid) cnt++; //统计<mid的值数
  56. for(int i=num[x]+;i<num[y];i++) cnt+=lower_bound(b+l[i],b+r[i]+,mid)-(b+l[i]);
  57. if(cnt>=k) R=mid;
  58. else L=mid+;
  59. }
  60. printf("%d\n",L-);
  61. }
  62. }
  63. inline void Front()
  64. {
  65. int ans=-;int* p;
  66. if(num[x]+>=num[y]) {for(int i=x;i<=y;i++) if(a[i]>ans && a[i]<k) ans=a[i];}
  67. else
  68. {
  69. for(int i=x;i<=r[num[x]];i++) if(a[i]>ans && a[i]<k) ans=a[i];
  70. for(int i=l[num[y]];i<=y;i++) if(a[i]>ans && a[i]<k) ans=a[i];
  71. for(int i=num[x]+;i<num[y];i++)
  72. {
  73. p=lower_bound(b+l[i],b+r[i]+,k);
  74. if(p!=b+l[i] && *(p-)<k && *(p-)>ans) ans=*(p-);
  75. }
  76. }
  77. printf("%d\n",ans);
  78. }
  79. inline void Next()
  80. {
  81. int ans=;int* p;
  82. if(num[x]+>=num[y]) {for(int i=x;i<=y;i++) if(a[i]<ans && a[i]>k) ans=a[i];}
  83. else
  84. {
  85. for(int i=x;i<=r[num[x]];i++) if(a[i]<ans && a[i]>k) ans=a[i];
  86. for(int i=l[num[y]];i<=y;i++) if(a[i]<ans && a[i]>k) ans=a[i];
  87. for(int i=num[x]+;i<num[y];i++)
  88. {
  89. p=upper_bound(b+l[i],b+r[i]+,k);
  90. if(p!=b+r[i]+ && *p>k && *p<ans) ans=*p;
  91. }
  92. }
  93. printf("%d\n",ans);
  94. }
  95. int main()
  96. {
  97. scanf("%d%d",&n,&m);
  98. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  99. makeblock();
  100. for(int i=;i<=m;i++)
  101. {
  102. scanf("%d%d%d",&op,&x,&y);
  103. if(op==) Update();
  104. else
  105. {
  106. scanf("%d",&k);
  107. if(op==) Rank();
  108. else if(op==) Kth();
  109. else if(op==) Front();
  110. else Next();
  111. }
  112. }
  113. return ;
  114. }

【分块】bzoj3196 Tyvj 1730 二逼平衡树的更多相关文章

  1. bzoj3196: Tyvj 1730 二逼平衡树 树套树

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=3196 题目: 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec ...

  2. 【带修莫队】【权值分块】bzoj3196 Tyvj 1730 二逼平衡树

    这题用了三种算法写: 分块+二分:O(n*sqrt(n*log(n)) 函数式权值分块:O(n*sqrt(n)) 带修莫队+权值分块:O(n5/3) 结果……复杂度越高的实际上跑得越快……最后这个竟然 ...

  3. 【函数式权值分块】【分块】bzoj3196 Tyvj 1730 二逼平衡树

    #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...

  4. 【线段树套平衡树】【pb_ds】bzoj3196 Tyvj 1730 二逼平衡树

    线段树套pb_ds里的平衡树,在洛谷OJ上测试,后三个测试点TLE #include<cstdio> #include<algorithm> #include<ext/p ...

  5. [bzoj3196]Tyvj 1730 二逼平衡树——线段树套平衡树

    题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查 ...

  6. BZOJ3196: Tyvj 1730 二逼平衡树

    传送门 主席树的常数蜜汁优越,在BZOJ上跑了rnk1. 做法很简单,主席树套BIT. 1-3做法很简单,第四个和第五个做法转换成前两个就行了. //BZOJ 3196 //by Cydiater / ...

  7. [bzoj3196][Tyvj 1730][二逼平衡树] (线段树套treap)

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查询k在 ...

  8. bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1807  Solved: 772[Submit][Stat ...

  9. BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )

    这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...

随机推荐

  1. HDU2732:Leapin' Lizards(最大流)

    Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. ZOJ3261:Connections in Galaxy War(逆向并查集)

    Connections in Galaxy War Time Limit: 3 Seconds      Memory Limit: 32768 KB 题目链接:http://acm.zju.edu. ...

  3. NOIP2003 神经网络(bfs)

    NOIP2003 神经网络 题目背景: 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应 ...

  4. E. Intercity Travelling

    E. Intercity Travelling time limit per test 1.5 seconds memory limit per test 256 megabytes input st ...

  5. ios webapp调试神器MIHTool

    android平台有直接用chrome beta就可以调试,具体操作办法可以查看这篇教程<Android 设备 Chrome 远程调试>Mac的高富帅直接可以用safari提供“web检查 ...

  6. 对比append插入数据产生的redo量

    --版本信息 SELECT * FROM v$version; Oracle - Prod PL - Production CORE Production TNS - Production NLSRT ...

  7. (转)Python中实现带Cookie的Http的Post请求

    转自crifan: http://www.crifan.com/python_http_post_request_with_cookie/ . . . .

  8. OpenStack搭建glance

    1.创建数据库 mysql -uroot -p create database glance; grant all privileges on glance.* to glance@'localhos ...

  9. Iframe跨域嵌入页面自动调整高度的办法

    http://www.a.com/A.html http://www.a.com/B.html http://www.a.com/D.js http://www.c.com/C.html A.html ...

  10. UVa 12265 贩卖土地 单调栈

    题意 输入一个\(n\times m\)的矩阵,每个格子可能是空地,也可能是沼泽.对于每个空地格子,求出以它为右下角的空矩形的最大周长,然后统计每个周长出现了多少次. 思路 对于 每一行 每两个沼泽之 ...