NC20164 [JSOI2008]最大数MAXNUMBER
题目
题目描述
现在请求你维护一个数列,要求提供以下两种操作:
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的更多相关文章
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- BZOJ-1012[JSOI2008]最大数maxnumber 线段树区间最值
这道题相对简单下面是题目: 1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MB Submit: 6542 Solve ...
- 【bzoj1012】[JSOI2008]最大数maxnumber
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8339 Solved: 3624[Submi ...
- Cogs 1844. [JSOI2008]最大数maxnumber
[JSOI2008]最大数maxnumber ★★ 输入文件:bzoj_1012.in 输出文件:bzoj_1012.out 简单对比 时间限制:3 s 内存限制:162 MB [题目描述] 现在请求 ...
- BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 10374 Solved: 4535[Subm ...
- [JSOI2008]最大数maxnumber
[JSOI2008]最大数maxnumber 标签: 线段树 单独队列 题目链接 题解 线段树裸题. 如果一直RE可能是你用的cin/cout. Code #include<cstdio> ...
- bzoj 1012: [JSOI2008]最大数maxnumber (线段树)
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 13081 Solved: 5654[Subm ...
- BZOJ 1012: [JSOI2008]最大数maxnumber 单调队列/线段树/树状数组/乱搞
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 4750 Solved: 2145[Submi ...
- 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 9851 Solved: 4318[Submi ...
- bzoj-1012 1012: [JSOI2008]最大数maxnumber(线段树)
题目链接: 1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MB Description 现在请求你维护一个数列,要 ...
随机推荐
- jvisualm 结合 visualGC 进行jvm监控,并分析垃圾回收
本文为博主原创,未经允许不得转载 1.jvisualm 的使用 打开 jdk 安装目录bin目录下的 jvisualvm.exe 工具 2. visual GC插件的安装及监控分析 Visual GC ...
- vue 中对style、disable 等样式进行条件判断
本文为博主原创,未经允许不得转载: 一 原生用法 style="width: 100%; margin-top: 20px" disabled 二 三元表达式 <a :st ...
- Java - 输出空心菱形
1. 思路:发现菱形的规律 ,定义三个变量,左边距和右边距,中间的边距 . 具体规律观察上图 . 2.上代码: //输出空心菱形 public class ForToLingXing { pub ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.30)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- Oracle数据类型的简单学习之一
Oracle数据类型的简单学习之一 背景 因为信创安可替代的发展 有很多项目提到了数据库切换到国产数据库的要求. 一般情况是要求从Oracle/SQLServer 迁移到国产的: 达梦/瀚高/人大金仓 ...
- Oracle19c on 银河麒麟的安装与升级
Oracle19c on 银河麒麟的安装与升级 下载内容 preinstall CentOS8 https://yum.oracle.com/repo/OracleLinux/OL8/appstrea ...
- [转帖]History of Unicode Release and Publication Dates
www.unicode.org For ease of reference, this page collects together information about the dates for v ...
- [转帖]使用 Dumpling 导出数据
16 Contributors 使用数据导出工具 Dumpling,你可以把存储在 TiDB 或 MySQL 中的数据导出为 SQL 或 CSV 格式,用于逻辑全量备份.Dumpling 也支持将 ...
- [转帖]TiKV Config Learn the TiKV configuration file
The TiKV configuration file supports more options than command-line parameters. You can find the def ...
- [转帖]OutOfMemory自动重启程序
OutOfMemory以后程序已经假死,无法再提供服务,最好的做法是dump内存,发送警告,然后重启服务 我的方案:利用at命令延迟启动 但有一个问题,at最多支持分钟操作,也就是说要1分钟以后才能启 ...