洛谷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 分析: 这道题用最大流解决. 首先构建模型. 一根柱子可以跳入和跳出,于是拆成两个点:入点和出点. ...
随机推荐
- python语法基础(类)
一.什么是类? 类是具有相同属性的一类事物 类还有功能和属性,属性就是这类事物的特征,而功能就是它能做什么,也是就是方法或者函数. 在python中类用关键词class来声明 二.类的声明 类的声明方 ...
- linux下使用自带mail发送邮件
linux下使用自带mail发送邮件 mailx工具说明: linux可以通过安装mailx工具,mailx是一个小型的邮件发送程序,一般可以通过该程序在linux系统上,进行监控linux系统状态并 ...
- 【idea】设置console控制台显示内容大小
Settings→Editor→General→Console 参考文章:https://blog.csdn.net/weixin_34363171/article/details/93444586
- lds 文件说明
主要符号说明 OUTPUT_FORMAT(bfdname) 指定输出可执行文件格式. OUTPUT_ARCH(bfdname) 指定输出可执行文件所运行 CPU 平台 ENTRY(symbol) 指定 ...
- sysobjects syscolumns
在sysobjects系统表中存储着数据库的所有对象,每个对象都有一个唯一的id号进行标识.object_id就是根据对象名称返回该对象的id.反之,object_name是根据对象id返回对象名称. ...
- Windows cd
显示当前目录名或改变当前目录. CHDIR [/D] [drive:][path]CHDIR [..]CD [/D] [drive:][path]CD [..] .. 指定要改成父目录. 键入 C ...
- 计算几何——直线交点poj1269
求直线交点还是要推一个公式的.. 见博客https://blog.csdn.net/u013050857/article/details/40923789 还要学一下向量的定点比分法 另外poj精度好 ...
- python封装email模块
一.代码 from email.mime.text import MIMEText from email.header import Header from email.utils import pa ...
- 使用docker安装redis
1.安装docker .检查内核版本,必须是3.10及以上 [root@localhost ~]# uname -r .安装docker [root@localhost ~]# yum install ...
- mysql用户和权限
1.创建用户 格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码" mysql>grant all privileges o ...