计蒜客 蒜头君的任务

题目描述

蒜头君的上司给蒜头君布置了一个任务,蒜头君维护一个数列,要求提供以下两种操作:

  1. 查询操作。

语法:Q L

功能:查询当前数列中末尾 L L L 个数中的最大的数,并输出这个数的值。

  1. 插入操作。

语法:A n

功能:将 n n n 加上 t t t,其中 t t t 是最近一次查询操作的答案(如果还未执行过查询操作,则 t = 0 t = 0 t=0),并将所得结果对一个固定的常数 D D D 取模,将所得答案插入到数列的末尾。

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

样例

样例输入

第一行两个整数, M M M 和 D D D,其中 M M M 表示操作的个数( M ≤ 200000 M \leq 200000 M≤200000), D D D 如上文中所述,满足 D D D 在 32 32 32 位整型范围内。

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

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

样例输出

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

96
93
96

算法与数据结构

树状数组
区间最值

题解

这道题就是直接套用树状数组区间最值的模板。

完整代码

#include <bits/stdc++.h>using namespace std;const int MAX_N = 200007;
int A[MAX_N] = {0}; // 输入数据 A
int C[MAX_N] = {0}; // 树状数组 Cint lowBit(int x) {return x & -x; // return x & (x ^ (x - 1))
}// 注意哪里是 A 哪里是 C
int getMax(int l, int r) {int ret = A[r];while (l <= r) {ret = max(ret, A[r]);for (--r; r - l >= lowBit(r); r -= lowBit(r))ret = max(ret, C[r]);}return ret;
}void change(int r) {C[r] = A[r];for (int i = 1; i < lowBit(r); i <<= 1)C[r] = max(C[r], C[r - i]);
}int main() {int M, D;int r = 1; // 树状数组下标从 1 开始int t = 0;scanf("%d%d", &M, &D);for (int i = 0; i < M; i++) {char op;scanf("\n%c", &op);if (op == 'Q') {int l;scanf("%d", &l);t = getMax(r - l, r - 1); // 最后 L 个数是 r - l 到 r - 1,不是从 l 到 rprintf("%d\n", t);} else {int n;scanf("%d", &n);A[r] = (n + t) % D; // 要记录 A[r]change(r);r++; // r 其实是作为数列最右端的标识}}return 0;
}

欢迎关注我的个人博客以优秀文章:凝神长老和他的朋友们(https://www.jxtxzzw.com)

也欢迎关注我的其他平台:知乎( https://s.zzw.ink/zhihu )、知乎专栏( https://s.zzw.ink/zhuanlan )、哔哩哔哩( https://s.zzw.ink/blbl )、微信公众号( 凝神长老和他的朋友们 )

计蒜客 - 蒜头君的任务相关推荐

  1. 计蒜客--蒜头君的新游戏

    1000ms  131072K 工作空闲之余,蒜头君经常带着同事们做游戏,最近蒜头君发明了一个好玩的新游戏:n 位同事围成一个圈,同事 A 手里拿着一个兔妮妮的娃娃.蒜头君喊游戏开始,每位手里拿着娃娃 ...

  2. 计蒜客-蒜头君回家(bfs)

    蒜头君要回家,但是他家的钥匙在他的朋友花椰妹手里,他要先从花椰妹手里取得钥匙才能回到家.花椰妹告诉他:"你家的钥匙被我复制了很多个,分别放在不同的地方." 蒜头君希望能尽快回到家中 ...

  3. 计蒜客--蒜头君回家

    蒜头君要回家,但是他家的钥匙在他的朋友花椰妹手里,他要先从花椰妹手里取得钥匙才能回到家.花椰妹告诉他:"你家的钥匙被我复制了很多个,分别放在不同的地方." 蒜头君希望能尽快回到家中 ...

  4. 计蒜客 蒜头君的训练室

    问题描述 蒜头君的训练室有 N 个站点,另外有 M 条单向边连接这些站点.第 i 条路从 Si站到 Ei站,有高度为 Hi的围栏,蒜头君是需要跳跃的.  现在蒜头君们有 T 个任务要完成.第 ii 个 ...

  5. 计蒜客 蒜头君学英语

    问题 蒜头君快要考托福了,这几天,蒜头君每天早上都起来记英语单词.花椰妹时不时地来考一考蒜头君:花椰妹会询问蒜头君一个单词,如果蒜头君背过这个单词,蒜头君会告诉花椰妹这个单词的意思,不然蒜头君会跟花椰 ...

  6. 计蒜客 蒜头君的购物口袋2 01背包问题

    蒜头君去超市购物,他有一只容量为 V 的购物袋,同时他想买n 件物品,已知每件物品的体积 ivi​和重要度pi​.蒜头君想知道,挑选哪些物品放入购物袋中,可以使得买到的物品重要度之和最大,且物品体积和 ...

  7. 计蒜客- 蒜头君的工厂

    E 蒜头君的工厂需要生产 n 个产品,每个产品会在记录本上记录开始生产的时间 x 以及完成生产的时间 y. 现在蒜头君拿到这本记录本以后想知道最多有多少件产品同时在生产线上生产. 注意:在同一时刻总是 ...

  8. [Java] 计蒜客---蒜头君的玩具

    一.内容 二.思路 用差分数组算出每个点总共被包含了几次,比如1-4就等于1-4区间的数组都加上1.这样a数组最终保存的就是装了这个点总共被覆盖几次. 由于每次只能选3条线段,所以数组里面每个点的值必 ...

  9. 计蒜客 蒜头君的数轴

    不考虑某个区间,其他区间必须距离相等,也就是要划分为距离为最大公约数. 那么如何快速求解任意$n-1$个区间的最大公约数?用l[i]表示前i个数的最大公约数,r[i]表示后$(n-i)$个区间的最大公 ...

最新文章

  1. 小程序自定义分享事件及回调函数
  2. debian 下配置common lisp环境
  3. Golang init函数执行顺序
  4. Vs2010 MFC 简单制作过程中的问题
  5. 列表框、下拉列表框或组合框与数据库
  6. Caffe学习1 :ProtoBuffer
  7. 私藏的google浏览器插件
  8. 【工作笔记001】SuperMap配准TransCAD底图
  9. 分布式网络爬虫功能模块组成
  10. 微前端子应用nginx跨域配置
  11. 【Flutter实战】移动技术发展史
  12. 服务数据对象简介(Java 环境中的下一代数据编程)
  13. 力扣 648. 单词替换
  14. openstack单节点安装(先电版)
  15. elementUI表格树动态合并列问题处理(最终版,---新需求)
  16. 陈晓和贝恩的真实目的:陈晓不会辞职,贝恩必然会换股
  17. 同程旅游张海龙:技术驱动旅游业未来
  18. DTCMS4.0建站流程
  19. 【L2-022 重排链表】天梯赛L2系列详细解答
  20. 一个系列搞定校招——简历篇

热门文章

  1. 【看表情包学Linux】冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用
  2. 视频怎么压缩变小?视频压缩变小的具体操作步骤
  3. 联想笔记本 ThinkPad T440 Wifi无法联网的解决方法
  4. JAVA后端面试经-三拳打死老师傅的那些套路问题,开卷你也不会
  5. Qt读取/写入Excel数据--QAxObject
  6. python手机编程软件-手机上Python编程的软件分享
  7. 【AMD、CMD和CommonJS】
  8. 基于Java编写的网络五子棋
  9. 2020年东三省玉米种植分布数据
  10. 在CAD制图软件中标注数学公式的操作技巧