NC20259 [SCOI2007]降雨量
题目
题目描述
我们常常会说这样的话:“X年是自Y年以来降雨量最多的”。它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格小于X年。
例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890, 则可以说“2005年是自2003年以来最多的”,但不能说“2005年是自2002年以来最多的”由于有些年份的降雨量未知,有的说法是可能正确也可以不正确的。
输入描述
输入仅一行包含一个正整数n,为已知的数据。
以下n行每行两个整数yi和ri,为年份和降雨量,按照年份从小 到大排列,即yi<yi+1。
下一行包含一个正整数m,为询问的次数。
以下m行每行包含两个数Y和X,即询问“X年是自Y年以来降雨量最多的。”这句话是必真、必假还是“有可能”。
输出描述
对于每一个询问,输出true,false或者maybe。
示例1
输入
6
2002 4920
2003 5901
2004 2832
2005 3890
2007 5609
2008 3024
5
2002 2005
2003 2005
2002 2007
2003 2007
2005 2008
输出
false
true
false
maybe
false
备注
100%的数据满足:\(1 \le n \le 50000, 1 \le m \le 10000, -10^9 \le y_i \le 10^9 , 1 \le r_i \le 10^9\)
题解
知识点:线段树,离散化。
数据范围显然需要离散化,然后就是普通的区间最大值查询,但是分类讨论年份左右端点会很麻烦:
- 左右是完全相等的,直接
true。 - 左右都不存在,直接
maybe。 - 左存在右不存在,如果已知的区间长度为 \(1\) 或除去右端点的区间最大值小于右端点值,则
maybe;否则false。 - 左不存在右存在,如果已知的区间长度为 \(1\) 或除去左端点的区间最大值小于左端点值,则
maybe;否则false。 - 左右都存在,若左端点值大于等于右端点值,且区间长度为1或2或除去左右端点的区间最大值小于右端点值,则继续判断;否则
false。若满足条件,则若已知的区间长度等于实际年份跨度,则true;否则maybe。
时间复杂度 \(O((n+m)\log n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct T {
int mx;
static T e() { return { (int)-2e9 }; }
friend T operator+(const T &a, const T &b) { return { max(a.mx,b.mx) }; }
};
template<class T>
class SegmentTree {
int n;
vector<T> node;
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() {}
SegmentTree(const vector<T> &src) { init(src); }
void init(const vector<T> &src) {
assert(src.size());
n = src.size() - 1;
node.assign(n << 2, T::e());
function<void(int, int, int)> build = [&](int rt, int l, int r) {
if (l == r) return node[rt] = src[l], void();
int mid = l + r >> 1;
build(rt << 1, l, mid);
build(rt << 1 | 1, mid + 1, r);
node[rt] = node[rt << 1] + node[rt << 1 | 1];
};
build(1, 1, n);
}
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 n;
cin >> n;
vector<T> a(n + 1);
vector<int> y_src(n + 1);
for (int i = 1;i <= n;i++) {
int y, r;
cin >> y >> r;
a[i] = { r };
y_src[i] = y;
}
auto get = [&](int x)->int { return lower_bound(y_src.begin() + 1, y_src.end(), x) - y_src.begin(); };
SegmentTree<T> sgt(a);
int m;
cin >> m;
while (m--) {
int l, r;
cin >> l >> r;
if (l > r) {
cout << "false" << '\n';
continue;
}//* 题意不明
if (l == r) {
cout << "true" << '\n';
continue;
}
int rkl = get(l), rkr = get(r);
if (y_src[rkl] != l && y_src[rkr] != r) cout << "maybe" << '\n';
else if (y_src[rkl] != l) {
if (rkl == rkr || sgt.query(rkl, rkr - 1).mx < a[rkr].mx) cout << "maybe" << '\n';
else cout << "false" << '\n';
}
else if (y_src[rkr] != r) {
if (rkl + 1 == rkr || sgt.query(rkl + 1, rkr - 1).mx < a[rkl].mx) cout << "maybe" << '\n';
else cout << "false" << '\n';
}
else if (a[rkl].mx >= a[rkr].mx && (rkl == rkr || rkl + 1 == rkr || sgt.query(rkl + 1, rkr - 1).mx < a[rkr].mx)) {
if (r - l > rkr - rkl) cout << "maybe" << '\n';
else cout << "true" << '\n';
}
else cout << "false" << '\n';
}
return 0;
}
NC20259 [SCOI2007]降雨量的更多相关文章
- [BZOJ1067][SCOI2007]降雨量
[BZOJ1067][SCOI2007]降雨量 试题描述 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格 ...
- bzoj 1067: [SCOI2007]降雨量 模擬
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2010 Solved: 503[Submit][Status] ...
- 1067: [SCOI2007]降雨量
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2148 Solved: 554[Submit][Status] ...
- 【BZOJ1067】[SCOI2007]降雨量 RMQ+特判
[BZOJ1067][SCOI2007]降雨量 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年 ...
- bzoj 1067: [SCOI2007]降雨量
题目链接: bzoj 1067: [SCOI2007]降雨量 题解: 很简单的一道题,但代码里有许多细节需要注意,切容易出错,调了三个小时OTZ 做一个st表维护区间最大值就 在获得年份在序列中的po ...
- 【线段树 细节题】bzoj1067: [SCOI2007]降雨量
主要还是细节分析:线段树作为工具 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小 ...
- BZOJ_1067_[SCOI2007]降雨量_ST表
BZOJ_1067_[SCOI2007]降雨量_ST表 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z< ...
- BZOJ1067 [SCOI2007]降雨量 RMQ???
求救!!!神犇帮我瞅瞅呗...未完...调了2个半小时线段树,没调出来,大家帮帮我啊!!! 小詹用st表写. 我的思路就是把中间空着的年份设为无限,然后一点点特判就行了...然而没出来... [SCO ...
- 【BZOJ】1067: [SCOI2007]降雨量(rmq+变态题)
http://www.lydsy.com/JudgeOnline/problem.php?id=1067 好不爽,弄了一个晚上. 好不爽. 还是照着别人程序拍着看的!!! 噗 这题很变态. 首先,我没 ...
- 1067: [SCOI2007]降雨量 - BZOJ
Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2 ...
随机推荐
- AHB 设计要点
Hreadyout 每个slave回复hreadyout通过mux给到master master会将hreadyin信号给到每个slave hreadyout开始的时候都为1,如果是为0,会出现问题, ...
- 2023第十四届极客大挑战 — RE WP
RE方向出自:队友. Shiftjmp 去花后按p然后再反编译 最后flag为SYC{W3lc0me_tO_th3_r3veR5e_w0r1d~} 点击就送的逆向题 gcc 1.s -o 1` 生成e ...
- springboot - 解决使用pagehelper 报 SQL语句异常
原因: mapper.xml 中的sql加上了分号. <select id="search" resultType="***.Table"> sel ...
- 函数指针、std::function、std::bind
函数指针.std::function.std::bind 函数指针: C++语法中可以直接将函数名作为指针, void fun(int a, int b); 在这个函数声明中,函数指针即为fun,传入 ...
- [转帖]harbor镜像仓库清理操作
https://www.cnblogs.com/FengGeBlog/p/15517706.html 两年前清理过一次harbor镜像,而现在又要面临清镜像的操作了,笔者目前所在的公司镜像是存放在ce ...
- [转帖]3.3.8. KWR运行期对比报告 KWR DIFF
https://help.kingbase.com.cn/v8/perfor/performance-optimization/performance-optimization-6.html#sys- ...
- [转]流程自动化机器人(RPA)概念、原理与实践
[转]流程自动化机器人(RPA)概念.原理与实践 http://blog.sina.com.cn/s/blog_be0833d00102yho9.html 大多数人每天都会使用到一些机器人流程自动化工 ...
- awk的简单样例
shell awk求和 当第一列相同时,对应的第二列相加 awk'{sum[$1]+=$2}END{for(c in sum){print c,sum[c]}}'输入文件名 在Shell中,我们可以用 ...
- vue获取子组件的实例$el、$attrs和inheritAttrs的使用
我的需求 有些时候,我们需要获取组件的DOM元素 有些小伙伴会说,这还不简单 直接使用this.$ref.xx不就可以了吗 我们来看一下,是不是我们想的那样简单 组件内容 <template&g ...
- 【解决一个小问题】golang 的 `-race`选项导致 unsafe代码 panic
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 为了提升性能,使用 unsafe 代码来重构了凯撒加密的代 ...