题目链接

题目

题目描述

现在请求你维护一个数列,要求提供以下两种操作:

1、 查询操作。语法:Q L 功能:查询当前数列中末尾L 个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。

2、 插入操作。语法:A n 功能:将n加 上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。限制:n是非负整数并且在长整范围内。

注意:初始时数列是空的,没有一个数。

输入描述

第一行两个整数,M和D,其中M表示操作的个数(M ≤ 200,000),D如上文中所述,满足D在longint内。

接下来M行,查询操作或者插入操作。

输出描述

对于每一个询问操作,输出一行。该行只有一个数,即序列中最后L个数的最大数。

示例1

输入

5 100
A 96
Q 1
A 97
Q 1
Q 2

输出

96
93
96

备注

对于全部的测试点,保证 \(1 \leq M \leq 2 \times 10^5,1 \leq D \leq 2 \times 10^9\) 。

题解

方法一

知识点:线段树。

可以先开满空间,之后就是普通的单点修改、区间查询了。

时间复杂度 \(O(m \log m)\)

空间复杂度 \(O(m)\)

方法二

知识点:ST表。

因为修改操作是追加形式的,同样可以写成向前合并的ST表,维护向后追加。

时间复杂度 \(O(m \log m)\)

空间复杂度 \(O(m)\)

代码

方法一

#include <bits/stdc++.h>
using namespace std;
using ll = long long; struct T {
ll mx;
static T e() { return { 1LL << 63 }; }
friend T operator+(const T &a, const T &b) { return { max(a.mx, b.mx) }; }
};
struct F {
ll upd;
T operator()(const T &x) { return { upd }; }
};
template<class T, class F>
class SegmentTree {
int n;
vector<T> node; void update(int rt, int l, int r, int x, F f) {
if (r < x || x < l)return;
if (l == r) return node[rt] = f(node[rt]), void();
int mid = l + r >> 1;
update(rt << 1, l, mid, x, f);
update(rt << 1 | 1, mid + 1, r, x, f);
node[rt] = node[rt << 1] + node[rt << 1 | 1];
} T query(int rt, int l, int r, int x, int y) {
if (r < x || y < l) return T::e();
if (x <= l && r <= y) return node[rt];
int mid = l + r >> 1;
return query(rt << 1, l, mid, x, y) + query(rt << 1 | 1, mid + 1, r, x, y);
} public:
SegmentTree(int _n = 0) { init(_n); } void init(int _n) {
n = _n;
node.assign(n << 2, T::e());
} void update(int x, F f) { update(1, 1, n, x, f); } T query(int x, int y) { return query(1, 1, n, x, y); }
}; int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int m, d;
cin >> m >> d;
SegmentTree<T, F> sgt(m);
int cnt = 0;
ll t = 0;
while (m--) {
char op;
int x;
cin >> op >> x;
if (op == 'A') sgt.update(++cnt, { ((t + x) % d + d) % d });
else cout << (t = sgt.query(cnt - x + 1, cnt).mx) << '\n';
}
return 0;
}

方法二

#include <bits/stdc++.h>
using namespace std;
using ll = long long; ll node[21][200007];//! 这里是往前走的,标准st表是往后走的 int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int m, d;
cin >> m >> d;
int cnt = 0;
ll t = 0;
while (m--) {
char op;
int x;
cin >> op >> x;
if (op == 'A') {
node[0][++cnt] = ((t + x) % d + d) % d;
for (int i = 1;i <= 20 && cnt - (1 << i) + 1 >= 1;i++)
node[i][cnt] = max(node[i - 1][cnt - (1 << i - 1)], node[i - 1][cnt]);
}
else {
int k = log2(x);
cout << (t = max(node[k][cnt - x + 1 + (1 << k) - 1], node[k][cnt])) << '\n';
}
}
return 0;
}

NC20164 [JSOI2008]最大数MAXNUMBER的更多相关文章

  1. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  2. BZOJ-1012[JSOI2008]最大数maxnumber 线段树区间最值

    这道题相对简单下面是题目: 1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MB Submit: 6542 Solve ...

  3. 【bzoj1012】[JSOI2008]最大数maxnumber

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8339  Solved: 3624[Submi ...

  4. Cogs 1844. [JSOI2008]最大数maxnumber

    [JSOI2008]最大数maxnumber ★★ 输入文件:bzoj_1012.in 输出文件:bzoj_1012.out 简单对比 时间限制:3 s 内存限制:162 MB [题目描述] 现在请求 ...

  5. BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 10374  Solved: 4535[Subm ...

  6. [JSOI2008]最大数maxnumber

    [JSOI2008]最大数maxnumber 标签: 线段树 单独队列 题目链接 题解 线段树裸题. 如果一直RE可能是你用的cin/cout. Code #include<cstdio> ...

  7. bzoj 1012: [JSOI2008]最大数maxnumber (线段树)

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 13081  Solved: 5654[Subm ...

  8. BZOJ 1012: [JSOI2008]最大数maxnumber 单调队列/线段树/树状数组/乱搞

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 4750  Solved: 2145[Submi ...

  9. 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 9851  Solved: 4318[Submi ...

  10. bzoj-1012 1012: [JSOI2008]最大数maxnumber(线段树)

    题目链接: 1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MB Description 现在请求你维护一个数列,要 ...

随机推荐

  1. nginx 负载均衡 proxy_pass 与 upstream 及 rewrite ,expires 的配置总结

    本文为博主原创,转载请注明出处: 先查看 一段 nginx 相关的配置: location /test/   {   set $arg_remote_addr $request_id; proxy_p ...

  2. 配置Maven项目的pom.xml时遇到input contained no data问题

    1.问题 2.解决 我发现每次当我修改一些部分之后,就会遇到这个问题 我遵循了他的建议重新排列标记属性,然后重新加载就解决了报错 个人怀疑是修改后并没有识别之类的? 最终原因:是我在Maven项目中的 ...

  3. 在虚拟机(Linux)中Docker中部署Nginx成功,但是在宿主机无法访问Nginx站点?

    1.问题 本文是基于黑马程序员Docker基础--常见命令一课中部署Nginx时遇到的问题作出解答. 在虚拟机(Linux)中Docker中部署Nginx成功,但是在宿主机无法访问Nginx站点 如图 ...

  4. C++初始化列表时,形参和实参名可以一样,编译器可以识别

    在这里初始化列表直接用age(age)即可,用this->age(age)反而会出错,C++不允许在成员初始化列表中使用this关键字来初始化类成员 class Person { public: ...

  5. [转帖]在Linux中切换cmake版本

    在Linux中切换cmake版本https://blog.whsir.com/post-6804.html   在Linux系统中,有时需要使用cmake进行程序编译,由于不同的Linux系统导致安装 ...

  6. K8S Only IPV6的创建过程之二 完整版

    K8S Only IPV6的创建过程之二 完整版 整体过程 1. 阿里云新增一台虚拟机, 开通IPV6.与数据库,redis实现物理隔离. 并且进行环境基本处理,安装kubeadm等组件. 2. ku ...

  7. [转帖]shell 使用sed或awk将文本中的上下两行合并为一行

    例如要装下面文本上下两行合并为一行 文件test内容: # cat test a1 ce ef 12 45 57 efef 5656 gfg 455 上下两行合并为一行: # sed -n '{N;s ...

  8. [转帖]linux audit审计(8)--开启audit对系统性能的影响

    https://www.cnblogs.com/xingmuxin/p/8875783.html 我们使用测试性能的工具,unixbench,它有一下几项测试项目: Execl Throughput ...

  9. [转帖]12.JVM运行时数据区之虚拟机栈概述

    https://blog.csdn.net/u011069294/article/details/107050001 目录 1. 内存中的栈与堆 2.栈的优点 1. 内存中的栈与堆 栈是运行时单位,堆 ...

  10. [转帖]高性能网络实战:借助 eBPF 来优化负载均衡的性能

    https://zhuanlan.zhihu.com/p/592981662 网络性能优化,eBPF 是如何发挥作用的呢? 本篇文章,我就以最常用的负载均衡器为例,带你一起来看看如何借助 eBPF 来 ...