记录编号 599533 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [USACO21Feb Platinum]No Time to Dry 最终得分 100
用户昵称 Gravatarwdsjl 是否通过 通过
代码语言 C++ 运行时间 3.074 s
提交时间 2025-03-20 21:37:56 内存使用 16.81 MiB
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4.  
  5. const int N = 2e5+10;
  6.  
  7. int pre[N];
  8.  
  9. struct node{
  10. int a,b,id;
  11. }qa[N];
  12.  
  13. bool cmp(node a,node b){
  14. return a.b<b.b;
  15. }
  16.  
  17. int n,q,t[N],res[N],s[N];
  18. int x[N*4];//?????????
  19. void build(int u,int l,int r){
  20. if(l==r){
  21. x[u]=s[l];
  22. return ;
  23. }
  24. int mid=(l+r)/2;
  25. build(u*2,l,mid);
  26. build(u*2+1,mid+1,r);
  27. x[u]=min(x[u*2],x[u*2+1]);
  28. return ;
  29. }
  30.  
  31. int g_min(int u,int l,int r,int ql,int qr){
  32. if(l==ql&&r==qr){
  33. return x[u];
  34. }
  35. int mid=(l+r)/2;
  36. if(qr<=mid)return g_min(u*2,l,mid,ql,qr);
  37. if(ql>mid)return g_min(u*2+1,mid+1,r,ql,qr);
  38. return min(g_min(u*2,l,mid,ql,mid),g_min(u*2+1,mid+1,r,mid+1,qr));
  39. }
  40.  
  41. int sm[N*4];
  42.  
  43. void push_down(int p){
  44. sm[p*2]+=sm[p];
  45. sm[p*2+1]+=sm[p];
  46. sm[p]=0;
  47. return;
  48. }
  49.  
  50. void insert(int p,int l,int r,int ql,int qr){
  51. if(l==ql&&r==qr){
  52. sm[p]++;
  53. return;
  54. }
  55. int mid=(l+r)>>1;
  56. if(qr<=mid)insert(p*2,l,mid,ql,qr);
  57. else if(ql>mid)insert(p*2+1,mid+1,r,ql,qr);
  58. else insert(p*2,l,mid,ql,mid),insert(p*2+1,mid+1,r,mid+1,qr);
  59. }
  60.  
  61. int getans(int p,int l,int r,int q){
  62. if(l==r)return sm[p];
  63. push_down(p);
  64. int mid=(l+r)>>1;
  65. if(q<=mid)return getans(p*2,l,mid,q);
  66. return getans(p*2+1,mid+1,r,q);
  67. }
  68.  
  69. signed main(){
  70. freopen("dry.in","r",stdin);
  71. freopen("dry.out","w",stdout);
  72. scanf("%lld%lld",&n,&q);
  73. for(int i=1;i<=n;i++){
  74. scanf("%lld",&s[i]);
  75. }
  76. build(1,1,n);
  77. for(int i=1;i<=q;i++){
  78. scanf("%lld%lld",&qa[i].a,&qa[i].b);
  79. qa[i].id=i;
  80. }
  81. sort(qa+1,qa+1+q,cmp);
  82. for(int i=1;i<=n;i++)pre[i]=t[s[i]],t[s[i]]=i;
  83. int now=1;
  84. // return 0;
  85. for(int i=1;i<=n;i++){
  86. if(s[i]<=g_min(1,1,n,pre[i]+1,i)){
  87. insert(1,1,n,pre[i]+1,i);
  88. }else{
  89. insert(1,1,n,1,i);
  90. }
  91. while(now<=q&&qa[now].b==i){
  92. res[qa[now].id]=getans(1,1,n,qa[now].a);
  93. now++;
  94. }
  95. }
  96. for(int i=1;i<=q;i++){
  97. printf("%lld\n",res[i]);
  98. }
  99. return 0;
  100. }