当前位置:   article > 正文

Educational Codeforces Round 46 (Rated for Div. 2) F. One Occurrence(线段树)

one occurrence

题目链接:http://codeforces.com/contest/1000/problem/F


按照位置维护,类似于区间出现的不同的数的做法,首先把所有的查询离线,然后每次更新的时候,设位置为i的数为a[i],然后我们将右边最近的a[i]的位置j更新为0,然后将位置i更新为j,查询的时候查找区间当中第一个大于R的位置。


代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN=5e5+5;
  4. template<typename T>
  5. struct seg
  6. {
  7. #define lson l,mid,rt<<1
  8. #define rson mid+1,r,rt<<1|1
  9. T mx[MAXN<<2];
  10. inline void push_up(int rt)
  11. {
  12. mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
  13. }
  14. void update(int pos,T val,int l,int r,int rt)
  15. {
  16. if(l==r)
  17. {
  18. mx[rt]=val;
  19. return ;
  20. }
  21. int mid=(l+r)>>1;
  22. if(pos<=mid) update(pos,val,lson);
  23. if(pos>mid) update(pos,val,rson);
  24. push_up(rt);
  25. }
  26. int query(int L,int R,int l,int r,int rt)
  27. {
  28. if(l==r) return mx[rt]>R?l:0;
  29. int mid=(l+r)>>1;
  30. if(L<=l&&r<=R)
  31. {
  32. if(mx[rt<<1]>R) return query(L,R,lson);
  33. if(mx[rt<<1|1]>R) return query(L,R,rson);
  34. return 0;
  35. }
  36. int ret=0;
  37. if(L<=mid) ret=query(L,R,lson);
  38. if(mid<R&&ret==0) ret=query(L,R,rson);
  39. return ret;
  40. }
  41. };
  42. struct Q
  43. {
  44. int l,r,id;
  45. bool operator < (const Q &o)const
  46. {
  47. return l>o.l;
  48. }
  49. }sv[MAXN];
  50. seg<int> se;
  51. int nxt[MAXN],pos[MAXN],a[MAXN],ans[MAXN];
  52. int main()
  53. {
  54. //freopen("in.txt","r",stdin);
  55. //freopen("out.txt","w",stdout);
  56. int n;
  57. scanf("%d",&n);
  58. for(int i=1;i<=n;i++)
  59. {
  60. scanf("%d",&a[i]);
  61. }
  62. memset(pos,0x3f,sizeof(pos));
  63. for(int i=n;i>=1;i--)
  64. {
  65. nxt[i]=pos[a[i]];
  66. pos[a[i]]=i;
  67. }
  68. int q;
  69. scanf("%d",&q);
  70. for(int i=1;i<=q;i++)
  71. {
  72. scanf("%d%d",&sv[i].l,&sv[i].r);
  73. sv[i].id=i;
  74. }
  75. sort(sv+1,sv+1+q);
  76. int now=1;
  77. for(int i=n;i>=1;i--)
  78. {
  79. if(nxt[i]<=n) se.update(nxt[i],0,1,n,1);
  80. se.update(i,nxt[i],1,n,1);
  81. while(now<=q&&sv[now].l==i)
  82. {
  83. ans[sv[now].id]=se.query(sv[now].l,sv[now].r,1,n,1);
  84. now++;
  85. }
  86. }
  87. for(int i=1;i<=q;i++)
  88. {
  89. printf("%d\n",a[ans[i]]);
  90. }
  91. return 0;
  92. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/912684
推荐阅读
相关标签
  

闽ICP备14008679号