1 条题解
-
0Guest 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%
- 上传者