题解 P1198 【[JSOI2008]最大数】
说起来这还是蒟蒻AC的第一道省选线段树呢。
这道题和其他线段树最大的不同就是在于本题数组一直在增大。
寻常的线段树蒟蒻习惯用如下的结构体储存,然而对于此题就不行了:
struct node{
int l, r;
int val;
} tree[maxn << ];
这是因为这道题没有用建树,因此l, r就不存在啊!
那么解决方法就是用朴实的tree数组储存val, l和r则手动传入函数!!
所以根据这个原理,稍微修改一下模板就可以得出全新的两个函数!!
void Update(ll l, ll r, ll index, ll value, ll pos) {
if(l == r) {
tree[pos] = value;
return ;
}
ll mid = (l + r) >> ;
if(mid >= index) Update(l, mid, index, value, pos << );
if(mid < index) Update(mid + , r, index, value, pos << | );
tree[pos] = max(tree[pos << ], tree[pos << | ]);
} ll Query(ll L, ll R, ll l, ll r, ll pos) {
if(L >= l && R <= r) return tree[pos];
ll mid = (L + R) >> ;
ll ans = ;
if(mid >= l) ans = max(ans, Query(L, mid, l, r, pos << ));
if(mid < r) ans = max(ans, Query(mid + , R, l, r, pos << | ));
return ans;
}
注明:第二个函数中,L,R表示当前区间,l,r表示寻找的区间。
完整AC代码献上:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std; typedef long long ll;
const int maxn = ; ll tree[maxn << ]; ll m, d, t = , len = , x;
char op; void Update(ll l, ll r, ll index, ll value, ll pos) {
if(l == r) {
tree[pos] = value;
return ;
}
ll mid = (l + r) >> ;
if(mid >= index) Update(l, mid, index, value, pos << );
if(mid < index) Update(mid + , r, index, value, pos << | );
tree[pos] = max(tree[pos << ], tree[pos << | ]);
} ll Query(ll L, ll R, ll l, ll r, ll pos) {
if(L >= l && R <= r) return tree[pos];
ll mid = (L + R) >> ;
ll ans = ;
if(mid >= l) ans = max(ans, Query(L, mid, l, r, pos << ));
if(mid < r) ans = max(ans, Query(mid + , R, l, r, pos << | ));
return ans;
} int main() {
cin >> m >> d;
for(ll i = ; i < m; i++){
cin >> op >> x;
if(op == 'Q') {
if(x == ) {
t = ;
cout << t << endl;
} else {
t = Query(, m, len - x + , len, );
cout << t << endl;
}
} else {
len++;
Update(, m, len, (x + t) % d, );
}
}
}
本代码1776ms, 氧化后1276ms。
比较玄学的一件事就是用cin过了,用scanf和快读却TLE了。【滑稽】
题解 P1198 【[JSOI2008]最大数】的更多相关文章
- 洛谷P1198 [JSOI2008]最大数
P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...
- 洛谷 P1198 [JSOI2008]最大数
洛谷 P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. ...
- 【题解】[JSOI2008]最大数
[题解][P1198 JSOI2008]最大数 正难则反,意想不到. 这道题是动态让你维护一个数列,已经在数列里面的数据不做改变,每次在最后加上一个数,强制在线. 既然正着做很难,考虑如果时间倒流,不 ...
- P1198 [JSOI2008]最大数(线段树基础)
P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: ...
- P1198 [JSOI2008]最大数(单调栈)
P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: ...
- P1198 [JSOI2008]最大数(线段树)
P1198 [JSOI2008]最大数(线段树) 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值 ...
- 洛谷P1198 [JSOI2008]最大数(单点修改,区间查询)
洛谷P1198 [JSOI2008]最大数 简单的线段树单点问题. 问题:读入A和Q时,按照读入一个字符会MLE,换成读入字符串就可以了. #include<bits/stdc++.h> ...
- 「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数
「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数 题面描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数, ...
- 【题解】洛谷P1198 [JSOI2008] 最大数(线段树)
洛谷P1198:https://www.luogu.org/problemnew/show/P1198 思路 一道水水的线段树 20分钟A掉 这道题只涉及到单点修改和区间查询 所以这道题甚至不用Laz ...
- 洛谷P1198 [JSOI2008]最大数(BZOJ.1012 )
To 洛谷.1198 最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当 ...
随机推荐
- Android程序能够构建和运行,但是报以下报错,为什么?
安卓程序写完之后能够构建和运行,但是会报以下的错误.不知道原因为何?求大神解答. 网上说的是混淆编译的原因,不过程序没有开启混淆编译. Error:warning: Ignoring InnerCla ...
- QT笔记 -- (6) opengl
参考 http://blog.csdn.net/myths_0/article/details/24431597 用glut绘制一个茶壶 一句话,继承QGLWidget,实现下面三个函数,用子类定义窗 ...
- pthread_join/pthread_exit的用法解析
官方说法: 函数pthread_join用来等待一个线程的结束.函数原型为: extern int pthread_join __P ((pthread_t __th, void **__thread ...
- SpringBoot学习笔记(16)----SpringBoot整合Swagger2
Swagger 是一个规范和完整的框架,用于生成,描述,调用和可视化RESTful风格的web服务 http://swagger.io Springfox的前身是swagger-springmvc,是 ...
- SpringBoot学习笔记(4)----SpringBoot中freemarker、thymeleaf的使用
1. freemarker引擎的使用 如果你使用的是idea或者eclipse中安装了sts插件,那么在新建项目时就可以直接指定试图模板 如图: 勾选freeMarker,此时springboot项目 ...
- [BeiJing2006]狼抓兔子 dijkstra+平面图最小割
一眼裸的最大流求最小割,然而数据范围过大,跑不下来. 我们可以将平面图转成对偶图,并进行连边. 这样,每条边的长度就对应原图中的割边长度. 起点到终点的最短路即为最小割. 别用SPFA,会死的很惨 C ...
- iOS:UISplitViewController的创建
UISplitViewController是iPad特有的系统方法,主要效果就是呈现iPad的经典切割界面 代码创建实例: - (BOOL)application:(UIApplication *)a ...
- [Javascript] Transduce over any Iteratable Collection
So far we've been transducing by manually calling .reduce() on arrays, but we want to be able to tra ...
- Trustie站点代码托管使用指南
"中国人的github"猛击Trustie官网,開始代码托管... 1. 新建项目 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...
- EL中的param和params
转自:https://blog.csdn.net/javamoo/article/details/55667449 ${param.name}等价于request.getParameter(" ...