[关闭]
@IOU 2018-06-09T12:06:23.000000Z 字数 3108 阅读 1086

点名

splay treap 主席树

题目

可以去网盘里看。

点名

【题目描述】
在 J 班的体育课上,同学们常常会迟到几分钟,但体育老师的点名却一直很
准时。老师只关心同学的身高,他会一次询问当前最高的身高,次高的身高,第
三高的身高,等等。在询问的过程中,会不时地有人插进队伍里。你需要回答老
师每次的询问。
【输入格式】
第一行两个整数 n,m,表示先后有 n 个人进队,老师询问了 m 次
第二行 n 个整数,第 i 个数 Ai 表示第 i 个进入队伍的同学的身高为 Ai
第三行 m 个整数,第 j 个数 Bj 表示老师在第 Bj 个同学进入队伍后有一次询问
【输出格式】
M 行,每行一个整数,依次表示老师每次询问的答案。数据保证合法
【样例输入】
7 4
9 7 2 8 14 1 8
1 2 6 6
【样例输出】
9
9
7
8
【样例解释】
(9){No.1=9};(9 7){No.2=9};(9 7 2 8 14 1){No.3=7;No.4=8}
【数据范围】
40%的数据保证 n≤1000
100%的数据保证 1≤m≤n≤30000;0≤Ai<2 32

思路

数据结构题,由于数据范围很小。splay、treap、带修改主席树都可以做。
全当复习吧。。

代码

treap

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cstdlib>
  6. #define maxn 300005
  7. #define lc ch[x][0]
  8. #define rc ch[x][1]
  9. #define ll long long
  10. using namespace std;
  11. ll seq[maxn],ans[maxn],s[maxn];
  12. int cnt,ch[maxn][2],size[maxn],fa[maxn],r[maxn];
  13. struct que
  14. {
  15. int v,id;
  16. bool operator<(que x)const
  17. {
  18. return v<x.v;
  19. }
  20. }q[maxn];
  21. void maintain(int x)
  22. {
  23. size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
  24. }
  25. void rotate(int &x,int d)
  26. {
  27. int t=ch[x][d^1];
  28. ch[x][d^1]=ch[t][d];
  29. ch[t][d]=x;
  30. maintain(x);maintain(t);
  31. x=t;
  32. }
  33. ll query(int x,int k)
  34. {
  35. if(size[lc]+1==k)return s[x];
  36. else if(size[lc]>=k)return query(lc,k);
  37. else return query(rc,k-1-size[lc]);
  38. }
  39. void insert(int &x,ll v,int f)
  40. {
  41. if(x==0){x=++cnt,s[x]=v,size[x]=1;fa[x]=f;r[x]=rand()%99999999+1;return;}
  42. else if(s[x]>=v){insert(lc,v,x);if(r[lc]<r[x])rotate(x,1);}
  43. else {insert(rc,v,x);if(r[rc]<r[x])rotate(x,0);}
  44. maintain(x);
  45. }
  46. int main()
  47. {
  48. srand(time(NULL));
  49. //freopen("rollcall.in","r",stdin);
  50. //freopen("rollcall.out","w",stdout);
  51. int n,m;cin>>n>>m;
  52. for(int i=1;i<=n;i++)
  53. scanf("%lld",&seq[i]);
  54. for(int i=1;i<=m;i++)
  55. scanf("%d",&q[i].v),q[i].id=i;
  56. sort(q+1,q+1+m);int rt=1;
  57. int j=1;rt=++cnt;size[rt]=1;s[rt]=seq[1];
  58. for(int i=1;i<=m;i++)
  59. {
  60. while(j<q[i].v){j++;insert(rt,seq[j],0);}
  61. ans[q[i].id]=query(rt,q[i].id);
  62. }
  63. for(int i=1;i<=m;i++)
  64. printf("%lld\n",ans[i]);
  65. return 0;
  66. }

splay

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cstdlib>
  6. #define maxn 300005
  7. #define lc ch[x][0]
  8. #define rc ch[x][1]
  9. #define ll long long
  10. using namespace std;
  11. ll seq[maxn],ans[maxn],s[maxn];
  12. int cnt,ch[maxn][2],size[maxn],fa[maxn],r[maxn],rt,tar;
  13. struct que
  14. {
  15. int v,id;
  16. bool operator<(que x)const
  17. {
  18. return v<x.v;
  19. }
  20. }q[maxn];
  21. void maintain(int x)
  22. {
  23. size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
  24. }
  25. void rotate(int &x)
  26. {
  27. int y=fa[x];
  28. int z=fa[y];
  29. int k=ch[y][1]==x;
  30. ch[z][ch[z][1]==y]=x;
  31. fa[x]=z;
  32. ch[y][k]=ch[x][k^1];
  33. fa[ch[x][k^1]]=y;
  34. ch[x][k^1]=y;
  35. fa[y]=x;
  36. maintain(y);maintain(z);maintain(x);
  37. }
  38. ll query(int x,int k)
  39. {
  40. if(size[lc]+1==k)return s[x];
  41. else if(size[lc]>=k)return query(lc,k);
  42. else return query(rc,k-1-size[lc]);
  43. }
  44. void splay(int x,int goal)
  45. {
  46. while(fa[x]!=goal)
  47. {
  48. int y=fa[x],z=fa[y];
  49. if(z!=goal)
  50. (ch[z][0]==y)^(ch[y][0]==x)?rotate(x):rotate(y);
  51. rotate(x);
  52. }
  53. if(goal==0)rt=x;
  54. }
  55. void insert(int &x,ll v)
  56. {
  57. if(x==0){x=++cnt,s[x]=v,size[x]=1;tar=x;return;}
  58. else if(s[x]>=v){insert(lc,v);fa[lc]=x;}
  59. else {insert(rc,v);fa[rc]=x;}
  60. maintain(x);
  61. }
  62. int main()
  63. {
  64. srand(time(NULL));
  65. //freopen("rollcall.in","r",stdin);
  66. //freopen("rollcall.out","w",stdout);
  67. int n,m;cin>>n>>m;
  68. for(int i=1;i<=n;i++)
  69. scanf("%lld",&seq[i]);
  70. for(int i=1;i<=m;i++)
  71. scanf("%d",&q[i].v),q[i].id=i;
  72. sort(q+1,q+1+m);
  73. int j=1;rt=++cnt;size[rt]=1;s[rt]=seq[1];
  74. for(int i=1;i<=m;i++)
  75. {
  76. while(j<q[i].v){j++;insert(rt,seq[j]);splay(tar,rt);}
  77. ans[q[i].id]=query(rt,q[i].id);
  78. }
  79. for(int i=1;i<=m;i++)
  80. printf("%lld\n",ans[i]);
  81. return 0;
  82. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注