洛谷P2471——[SCOI2007]降雨量
本机AC提交RE……
传送门:QAQQAQ
题意:自己看
思路:据说这道题用RMQ做很快,但这道题线段树是可以的
线段树维护一段区间最左年,最右年,是否有间隙和区间最大值
这道题分类讨论是一大难点,主要分为以下几种情况:
1.AB均不确定,输出maybe
2.A确定B不确定:
若A是A到B最大的,输出maybe
否则输出false
3.A不确定B确定:
若B是lower_bound(A)到B最大的,则输出maybe
否则输出false
4.A确定B确定
若B是A+1到B最大的,A是A到B最大的,且之间没有间隙,输出true
若满足上述条件,但有间隙,则输出maybe
否则输出false
在代码实现方面,我先是没有考虑“严格小于”这一条件,认为最大值等于B就行了,而没有判断之前有无相等
然后加了一些特判防止自己玄学线段树越界停不下来。。。(最近代码实现能力有待提升啊。。。)
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=; int n;
struct node
{
int ly,ry,max_r,Gap;
}tree[N*];
int rain[N],year[N]; void push_up(node& fa,node ls,node rs)
{
fa.ly=ls.ly;
fa.ry=rs.ry;
fa.max_r=max(ls.max_r,rs.max_r);
fa.Gap=;
if(ls.Gap||rs.Gap) fa.Gap=;
if(ls.ry+<rs.ly) fa.Gap=;
} void build(int x,int l,int r)
{
if(l==r)
{
tree[x].ly=year[l];
tree[x].ry=year[l];
tree[x].max_r=rain[l];
tree[x].Gap=;
return;
}
int mid=(l+r)>>;
build(x+x,l,mid);
build(x+x+,mid+,r);
push_up(tree[x],tree[x+x],tree[x+x+]);
} node query(int x,int l,int r,int L,int R)
{
node ret;
if(L<=l&&R>=r) return tree[x];
int mid=(l+r)>>;
if(mid<L) return query(x+x+,mid+,r,L,R);
if(mid>=R) return query(x+x,l,mid,L,R);
node ls=query(x+x,l,mid,L,R);
node rs=query(x+x+,mid+,r,L,R);
push_up(ret,ls,rs);
return ret;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d%d",&year[i],&rain[i]);
build(,,n);
int q; scanf("%d",&q);
while(q--)
{
int x,y,xx,yy,bl=;
scanf("%d%d",&xx,&yy);
if(yy<xx)
{
puts("false");
continue;
}
if(xx==yy)
{
puts("maybe");
continue;
}
x=lower_bound(year+,year+n+,xx)-year;
y=lower_bound(year+,year+n+,yy)-year;
if(xx!=year[x]&&yy!=year[y]) puts("maybe");
else if(xx!=year[x])
{
if(y==||x==y) puts("maybe");
else
{
node n1=query(,,n,x,y);
node n2=query(,,n,x,y-);
//中间降雨量必须严格小于!
if(n1.max_r==rain[y]&&n2.max_r<rain[y]) puts("maybe");
else puts("false");
}
}
else if(yy!=year[y])
{
if(x==n||x==y-) puts("maybe");
else
{
node n1=query(,,n,x,y-);
node n2=query(,,n,x+,y-);
if(n1.max_r==rain[x]&&n2.max_r<rain[x]) puts("maybe");
else puts("false");
}
}
else
{
if(x+==y)
{
if(rain[x]<rain[y]) puts("false");
else if(year[x]+==year[y]) puts("true");
else puts("maybe");
continue;//之前没写continue啊啊啊。。。
}//特判防止线段树越界
node n1=query(,,n,x,y);
node n2=query(,,n,x+,y);
node n3=query(,,n,x+,y-);
if(n2.max_r==rain[y]&&rain[y]<=rain[x]&&n3.max_r<rain[y])
{
if(n1.Gap) puts("maybe");
else puts("true");
}
else puts("false");
}
}
return ;
}
洛谷P2471——[SCOI2007]降雨量的更多相关文章
- 洛谷P2471 [SCOI2007] 降雨量 [RMQ,模拟]
题目传送门 降雨量 题目背景 07四川省选 题目描述 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X ...
- P2471 [SCOI2007]降雨量
Description 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2 ...
- 洛谷 P2053 [SCOI2007]修车 解题报告
P2053 [SCOI2007]修车 题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术 ...
- BZOJ1067&P2471 [SCOI2007]降雨量[线段树裸题+细节注意]
dlntqlwsl 很裸的一道线段树题,被硬生生刷成了紫题..可能因为细节问题吧,我也栽了一次WA50分.不过这个隐藏条件真的对本菜鸡来说不易发现啊. 未知的年份连续的就看成一个就好了,把年份都离散化 ...
- 洛谷P2470 [SCOI2007]压缩(区间dp)
题意 题目链接 Sol 神仙题Orz 考虑区间dp,如果我们只设\(f[l][r]\)表示\(s_{lr}\)被压缩的最小长度,而不去关心内部\(M\)分布的话,可能在转移的时候转移出非法状态 因此考 ...
- 洛谷P4165 [SCOI2007]组队(排序 堆)
题意 题目链接 Sol 跟我一起大喊:n方过百万,暴力踩标算! 一个很显然的思路是枚举\(H, S\)的最小值算,复杂度\(O(n^3)\) 我们可以把式子整理一下,变成 \[A H_i + B S_ ...
- 洛谷 P2053 [SCOI2007]修车(最小费用最大流)
题解 最小费用最大流 n和m是反着的 首先, \[ ans = \sum{cost[i][j]}*k \] 其中,\(k\)为它在当前技术人员那里,排倒数第\(k\)个修 我们可以对于每个技术人员进行 ...
- 洛谷 P2053 [SCOI2007]修车
题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...
- 洛谷P2472 [SCOI2007]蜥蜴 题解
题目链接: https://www.luogu.org/problemnew/show/P2472 分析: 这道题用最大流解决. 首先构建模型. 一根柱子可以跳入和跳出,于是拆成两个点:入点和出点. ...
随机推荐
- 买不到的数目 /// 结论公式 oj26316
题目大意: 给定a b(这题题意不清 其实a b互质) 设变量x y(x>=0,y>=0),求 x*a+y*b=c 找到最大的不可能达到的c 如a=4 b=7 那么c=14 有这样一个定理 ...
- jdbc_mysql----函数助手参数化
第一个值填写的是文件路径 第二个值填写的是从第几个开始执行,从0开始
- 不同JDK版本之间的intern()方法的区别-JDK6 VS JDK6+
String s = new Stirng(“a”); s.intern(); JDK6:当调用intern()方法时,如果字符串常量池先前已创建出该字符串对象,则返回池中的该字符串的引用.否则,将此 ...
- Docker学习のDocker镜像
一.列出镜像 命令:docker images [optsions] [repositort] -a 标识列出所有 -f 写过滤条件 --no-trunc 不截断id -q 只显示唯一id rep ...
- [转载]HTTPS的工作原理
HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息.TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺 ...
- list集合排序2
java根据List内对象的属性排序 原创 2016年12月07日 00:20:01 标签: java / 对象 / sort / compare 2625 方法一:实现Comparator接口,并重 ...
- 通讯录查询(Profile Lookup)——freeCodeCamp
- 查看收到的邮件的来源ip以及包信息
有时我们需要知道收到的邮件是从哪台服务器发送过来的,或者想知道该邮件的报文头是怎样的.以下以网易邮箱为例介绍如果抓取这些信息. 首先我们需要知道网易邮箱的访问服务器(拉协议),由于SMTP是推的协议, ...
- MFC打开/保存文件对话框:CFileDialog
MFC打开/保存文件对话框:CFileDialog CFileDialog 文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下: CFileDialog::CFileDial ...
- System.Clollections.ICollection.cs
ylbtech-System.Clollections.ICollection.cs 1.程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicK ...