记录编号 599527 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [USACO21Feb Platinum]No Time to Dry 最终得分 100
用户昵称 Gravatar李奇文 是否通过 通过
代码语言 C++ 运行时间 10.626 s
提交时间 2025-03-20 21:20:29 内存使用 9.30 MiB
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=2e5+5;
  4. const int S=450;
  5. int n,Q,a[N],ans[N];
  6. int L[N],R[N],pre[N];
  7. struct qnode{
  8. int l,r,x,q;
  9. }que[N];
  10. bool cmp(qnode a,qnode b){
  11. if(a.x==b.x)return a.r<b.r;
  12. return a.x<b.x;
  13. }
  14. int t[N];
  15. void pushup(int p){
  16. t[p]=min(t[p<<1],t[p<<1|1]);
  17. }
  18. void build(int p,int l,int r){
  19. if(l==r){
  20. t[p]=a[l];
  21. return;
  22. }
  23. int mid=(l+r)>>1;
  24. build(p<<1,l,mid);
  25. build(p<<1|1,mid+1,r);
  26. pushup(p);
  27. }
  28. int query(int p,int l,int r,int L,int R){
  29. if(L>R)return -1;
  30. if(L<=l&&r<=R){
  31. return t[p];
  32. }
  33. int mid=(l+r)>>1;
  34. if(R<=mid) return query(p<<1,l,mid,L,R);
  35. if(L>mid) return query(p<<1|1,mid+1,r,L,R);
  36. return min(query(p<<1,l,mid,L,R),query(p<<1|1,mid+1,r,L,R));
  37. }
  38. int main(){
  39. freopen("dry.in","r",stdin);
  40. freopen("dry.out","w",stdout);
  41. std::cin>>n>>Q;
  42. for(int i=1;i<=n;i++) std::cin>>a[i];
  43. build(1,1,n);
  44. memset(pre,0,sizeof(pre));
  45. for(int i=1;i<=n;i++){
  46. if(pre[a[i]]) L[i]=(query(1,1,n,pre[a[i]],i)<a[i]?-1:pre[a[i]]);
  47. else L[i]=-1;pre[a[i]]=i;
  48. }
  49. memset(pre,0,sizeof(pre));
  50. for(int i=n;i;i--){
  51. if(pre[a[i]]) R[i]=(query(1,1,n,i,pre[a[i]])<a[i]?n+5:pre[a[i]]);
  52. else R[i]=n+5;pre[a[i]]=i;
  53. }
  54. for(int i=1;i<=Q;i++){
  55. int l,r;
  56. std::cin>>l>>r;
  57. que[i]=(qnode){l,r,l/S+1,i};
  58. }
  59. sort(que+1,que+Q+1,cmp);
  60. int l=1,r=0,res=0;
  61. for(int i=1;i<=Q;i++){
  62. int ql=que[i].l,qr=que[i].r;
  63. while(l>ql){
  64. l--;
  65. res+=R[l]>r;
  66. }
  67. while(r<qr){
  68. r++;
  69. res+=L[r]<l;
  70. }
  71. while(l<ql){
  72. res-=R[l]>r;
  73. l++;
  74. }
  75. while(r>qr){
  76. res-=L[r]<l;
  77. r--;
  78. }
  79. ans[que[i].q]=res;
  80. }
  81. for(int i=1;i<=Q;i++) std::cout<<ans[i]<<endl;
  82. return 0;
  83. }