1 条题解
- 
  0
Guest LV 0 MOD
 - 
  0
直接模拟即可。
#include<bits/stdc++.h> using namespace std; int n,m,k,sum; int a[300005]; long long l,r,cnt=0; int main() { cin>>n>>m>>k; for(int i=1; i<=n; i++) { cin>>a[i]; if(a[i]>=(-1*k)&&a[i]<=k)//我们把一开始在范围内的人用 sum 先记录下来 sum++; } sort(a+1,a+1+n);//开始按从小到大排序 l=1,r=n; for(int i=1; i<=m; i++) { int op,x; cin>>op;//输入询问的种类 if(1==op)//右移 x { cin>>x; cnt+=x;//cnt 表示当前到底移动了多少(例如,cnt 为 -2 表示所有人左移 2 格) while(r>=l&&a[r]+cnt>k)//越界了且移动后超过界限(因为向右移只会动右边界) { sum--;//直接减掉 r--;//右边界 -- } } else if(2==op)//左移 x { cin>>x; cnt-=x; while(l<=r&&a[l]+cnt<(-1*k))//越界了且移动后超过界限(因为向左移只会动左边界) { sum--;//直接减掉 l++;//左边界 ++ } } else if(3==op)//询问 cout<<sum<<endl;//最后结果输出 } return 0; } 
- 1
 
信息
- ID
 - 1448
 - 难度
 - 4
 - 分类
 - (无)
 - 标签
 - 递交数
 - 3
 - 已通过
 - 2
 - 通过率
 - 67%
 - 上传者