bzoj1012

来源:互联网 发布:网络骗局如何报警 编辑:程序博客网 时间:2024/05/18 13:24

两个操作:加数、查询后几个数的最大值。

明显可以用单调队列啊。查询时二分,由于序列单减,故,越接近要查的区间的左点越好

#include <cstdio>#include <cstring>#define ll long long#define M 220000struct node {int p; ll x;}Q[M];int m; ll D;int main() {freopen("1012.in", "r", stdin);scanf("%d%lld\n", &m, &D);memset(Q, 0, sizeof(Q));int tail = 0;ll t = 0;int cnt = 0;for(int i = 1; i <= m; ++i) {char c = getchar();ll n; scanf("%lld\n", &n);if(c == 'A') {++cnt;n+= t; n%= D;while(tail > 0 && Q[tail].x <= n) --tail;Q[++tail].x = n; Q[tail].p = cnt;}else {int l = 1, r = tail, mid;int curl = cnt - n + 1;while(l < r) {mid = (l + r)>>1;if(Q[mid].p < curl) l = mid + 1;else r = mid;}t = Q[r].x;printf("%lld\n", t);}}return 0;}


原创粉丝点击