1012: [JSOI2008]最大数maxnumber
2016-09-06 01:50
281 查看
现在请求你维护一个数列,要求提供以下两种操作:1、 查询操作。语法:Q L 功能:查询当前数列中末尾L
个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。2、 插入操作。语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。限制:n是非负整数并且在长整范围内。注意:初始时数列是空的,没有一个数。
Input
第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足D在longint内。接下来
M行,查询操作或者插入操作。
Output
对于每一个询问操作,输出一行。该行只有一个数,即序列中最后L个数的最大数。
Sample Input
5 100
A 96
Q 1
A 97
Q 1
Q 2
Sample Output
96
93
96
裸线段树,单点更新,区间求最值
个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。2、 插入操作。语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。限制:n是非负整数并且在长整范围内。注意:初始时数列是空的,没有一个数。
Input
第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足D在longint内。接下来
M行,查询操作或者插入操作。
Output
对于每一个询问操作,输出一行。该行只有一个数,即序列中最后L个数的最大数。
Sample Input
5 100
A 96
Q 1
A 97
Q 1
Q 2
Sample Output
96
93
96
裸线段树,单点更新,区间求最值
#include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cctype> #include<cmath> #include<ctime> #include<string> #include<stack> #include<deque> #include<queue> #include<list> #include<set> #include<map> #include<cstdio> #include<limits.h> #define MOD 1000000007 #define fir first #define sec second #define fin freopen("/home/ostreambaba/文档/input.txt", "r", stdin) #define fout freopen("/home/ostreambaba/文档/output.txt", "w", stdout) #define mes(x, m) memset(x, m, sizeof(x)) #define Pii pair<int, int> #define Pll pair<ll, ll> #define INF 1e9+7 #define Pi 4.0*atan(1.0) #define lowbit(x) (x&(-x)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define scini(n) scanf("%d", &n) #define scinl(n) scanf("%lld", &n) #define scinii(n, m) scanf("%d%d", &n, &m) #define scinll(n, m) scanf("%lld%lld", &n, &m) #define scout(n) printf("%d\n", n); typedef long long ll; typedef unsigned long long ull; const double eps = 1e-6; const int maxn = 200010; using namespace std; int sum[maxn<<2]; void PushUp(int rt) { sum[rt] = max(sum[rt<<1], sum[rt<<1|1]); } void update(int p, int add, int l, int r, int rt) { if(l == r){ sum[rt] = add; return; } int m = (l+r)>>1; if(p<=m){ update(p, add, lson); } else{ update(p, add, rson); } PushUp(rt); } int query(int L, int R, int l, int r, int rt) { if(L <= l && r <= R){ return sum[rt]; } int m = (l + r) >> 1; int ret = 0; if(L <= m){ ret = max(ret, query(L, R, lson)); } if(R > m){ ret = max(ret, query(L, R, rson)); } return ret; } int main() { //fin; int M, D, n, N; int length = 0; scinii(M, D); mes(sum, 0); N = M; int res = 0; while(M--){ char op; scanf("%*c%c%d", &op, &n); if(op == 'A'){ ++length; update(length, (n+res)%D, 1, N, 1); } else{ res = query(length-n+1, length, 1, N, 1); printf("%d\n", res); } } return 0; }
相关文章推荐
- 第29篇 JS及html
- 如何使用jackson美化输出json/xml
- js_array
- JSON、XML、TOML、CSON、YAML 大比拼
- fullpage.js全屏滚动插件使用实例
- JavaScript 继承详解及示例代码
- JavaScript中push(),join() 函数 实例详解
- JS原型链 详解及示例代码
- 原生JS:Date对象全面解析
- 使用JS实现图片展示瀑布流效果(简单实例)
- js 获取元素所有兄弟节点的实现方法
- python 转换 Javascript %u 字符串为python unicode的代码
- JavaScript跨域问题总结
- JavaScript 变量、作用域及内存详解
- JavaScript函数模式详解
- JavaScript 继承方式详解
- JavaScript 闭包详解
- NProgress.js一款炫酷的网页加载进度显示插件
- Javascript 不可不知的秘密 -- Class 与 面向对象
- Ajax + Json 基本用法(自整理)