记录编号 449537 评测结果 AAAAAAAAAA
题目名称 [SDOI 2009] HH的项链 最终得分 100
用户昵称 GravatarHzoi_Mafia 是否通过 通过
代码语言 C++ 运行时间 2.647 s
提交时间 2017-09-14 16:40:50 内存使用 11.24 MiB
显示代码纯文本
  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. using namespace std;
  7. inline int read(){
  8. int sum(0);
  9. char ch(getchar());
  10. for(;ch<'0'||ch>'9';ch=getchar());
  11. for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar());
  12. return sum;
  13. }
  14. int n,m,blo;
  15. int w[50005],cnt[1000005],bl[1000005];
  16. int bloans[5005],l[5005],r[5005];
  17. int ans[200005];
  18. struct que{
  19. int l,r,id;
  20. }q[200005];
  21. bool operator<(que a,que b){
  22. if(bl[a.l]!=bl[b.l])
  23. return a.l<b.l;
  24. return a.r<b.r;
  25. }
  26. int mx;
  27. inline void del(int x){
  28. --cnt[x];
  29. if(cnt[x]==0)
  30. --bloans[bl[x]];
  31. }
  32. inline void add(int x){
  33. ++cnt[x];
  34. if(cnt[x]==1)
  35. ++bloans[bl[x]];
  36. }
  37. int tot;
  38. inline int query(){
  39. int ret(0);
  40. for(int i=1;i<=tot;++i)
  41. ret+=bloans[i];
  42. return ret;
  43. }
  44. inline int gg(){
  45. freopen("diff.in","r",stdin);
  46. freopen("diff.out","w",stdout);
  47. n=read();
  48. for(int i=1;i<=n;++i)
  49. w[i]=read(),mx=max(mx,w[i]);
  50. blo=sqrt(mx>>1);
  51. for(int i=1;i<=mx;++i){
  52. bl[i]=(i-1)/blo+1;
  53. r[bl[i]]=i;
  54. tot=bl[i];
  55. if(!l[bl[i]])
  56. l[bl[i]]=i;
  57. }
  58. m=read();
  59. for(int i=1;i<=m;++i)
  60. q[i].l=read(),q[i].r=read(),q[i].id=i;
  61. sort(q+1,q+m+1);
  62. int l(1),r(0);
  63. for(int i=1;i<=m;++i){
  64. while(l<q[i].l){
  65. del(w[l]);
  66. ++l;
  67. }
  68. while(r>q[i].r){
  69. del(w[r]);
  70. --r;
  71. }
  72. while(l>q[i].l){
  73. --l;
  74. add(w[l]);
  75. }
  76. while(r<q[i].r){
  77. ++r;
  78. add(w[r]);
  79. }
  80. ans[q[i].id]=query();
  81. }
  82. for(int i=1;i<=m;++i)
  83. printf("%d\n",ans[i]);
  84. return 0;
  85. }
  86. int K(gg());
  87. int main(){;}