2 条题解
-
0
只移动前后边界,二分搜索越界的机器人
#include<bits/stdc++.h> using namespace std; #define int long long #define MAX_SIZE 333333 int a[MAX_SIZE]; int n, m, s; int lower_(int x){ int* t = lower_bound(a + 1, a + n + 1, x); return (t - a - 1); } int upper_(int x){ int *t = upper_bound(a + 1, a + n + 1, x); return (t - a); } signed main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m >> s; for (int i = 1; i <= n; i++){ cin >> a[i]; } sort(a + 1, a + n + 1); int ss = -s; int q = 0; int p = n + 1; while(m--){ int op, d, a, b; cin >> op; if (op == 1){ cin >> d; ss -= d; s -= d; a = lower_(ss); b = upper_(s); q = max(q, a); p = min(p, b); //cout << "q = " << q << "; p = " << p << "\n"; }else if (op == 2){ cin >> d; ss += d; s += d; a = lower_(ss); b = upper_(s); q = max(q, a); p = min(p, b); //cout << "q = " << q << "; p = " << p << "\n"; }else { cout << max(p - q - 1, 0LL) << "\n"; } } return 0; } -
0
#include<bits/stdc++.h> #define int long long using namespace std; const int N = 300000 + 10; int n, m, k, op, x, tot, a[N]; //tot记录目前一共向正方向移动了多少个单位,可以是负数(负数代表向反方向移动) deque<int> q;//定义双向队列 signed main(){ cin >> n >> m >> k; for(int i=1;i<=n;i++) cin >> a[i];//需要另开一个数组输入,因为要排序 sort(a + 1, a + 1 + n);//排序 for(int i=1;i<=n;i++) q.push_back(a[i]);//进队 for(int i=1;i<=m;i++){ cin >> op; if(op == 3) cout << q.size() << endl;//输出队列长度,也就是元素个数 else if(op == 1){ cin >> x; tot += x;//刷新tot while(!q.empty()){ int v = q.back(); if(v + tot > k) q.pop_back();//如果此埴轮移动完超过k,就被淘汰了 else break; } }else if(op == 2){ cin >> x; tot -= x;//刷新tot while(!q.empty()){ int v = q.front(); if(v + tot < -k) q.pop_front();//如果此埴轮移动完小于-k,也会被淘汰 (从队头弹出) else break; } } } return 0; }
- 1
信息
- ID
- 86
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 9
- 标签
- 递交数
- 106
- 已通过
- 12
- 上传者