Description

  我们常常会说这样的话:“X年是自Y年以来降雨量最多的”。它的含义是X年的降雨量不超过Y年,且对于任意
Y<Z<X,Z年的降雨量严格小于X年。例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,
则可以说“2005年是自2003年以来最多的”,但不能说“2005年是自2002年以来最多的”由于有些年份的降雨量未
知,有的说法是可能正确也可以不正确的。

Input

  输入仅一行包含一个正整数n,为已知的数据。以下n行每行两个整数yi和ri,为年份和降雨量,按照年份从小
到大排列,即yi<yi+1。下一行包含一个正整数m,为询问的次数。以下m行每行包含两个数Y和X,即询问“X年是
自Y年以来降雨量最多的。”这句话是必真、必假还是“有可能”。

Output

  对于每一个询问,输出true,false或者maybe。

Sample Input

6
2002 4920
2003 5901
2004 2832
2005 3890
2007 5609
2008 3024
5
2002 2005
2003 2005
2002 2007
2003 2007
2005 2008

Sample Output

false
true
false
maybe
false

HINT

100%的数据满足:1<=n<=50000, 1<=m<=10000, -10^9<=yi<=10^9, 1<=ri<=10^9

非常水的一道题……无非就是查询一下区间最大值然后离散化一下
注意分类讨论就好

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N (100000+100)
using namespace std; int a[N],b[N],Segt[N*],n,m,x,y; int getid(int x)
{
return lower_bound(a+,a+n+,x)-a;
} void Update(int node,int l,int r,int l1,int r1,int k)
{
if (r1<l || l1>r) return;
if (l1<=l&&r<=r1)
{
Segt[node]=k;
return;
}
int mid=(l+r)/;
Update(node*,l,mid,l1,r1,k);
Update(node*+,mid+,r,l1,r1,k);
Segt[node]=max(Segt[node*],Segt[node*+]);
} int Query(int node,int l,int r,int l1,int r1)
{
if (r1<l || l1>r) return -0x7fffffff;
if (l1<=l&&r<=r1)
return Segt[node];
int mid=(l+r)/;
return max(Query(node*,l,mid,l1,r1),
Query(node*+,mid+,r,l1,r1));
} int main()
{
scanf("%d",&n);
for (int i=; i<=n; ++i)
{
scanf("%d%d",&a[i],&b[i]);
Update(,,n,i,i,b[i]);
}
scanf("%d",&m);
for (int i=; i<=m; ++i)
{
scanf("%d%d",&x,&y);
int idx=getid(x),idy=getid(y);
if (a[idx]==x && a[idy]==y)//如果询问的左右端点都已知
{
int maxn=Query(,,n,idx+,idy-);
if (b[idx]<b[idy] || maxn>=b[idy]) printf("false\n");
else if (y-x!=idy-idx) printf("maybe\n");
else printf("true\n");
}
if (a[idx]!=x && a[idy]!=y)//询问的左右端点都未知
printf("maybe\n");
if (a[idx]==x && a[idy]!=y)//询问的右端点未知
{
if (a[idy]<y) idy++;
int maxn=Query(,,n,idx+,idy-);
if (maxn>=b[idx]) printf("false\n");
else printf("maybe\n");
}
if (a[idx]!=x && a[idy]==y)//询问的左端点未知
{
if (a[idx]>x) idx--;
int maxn=Query(,,n,idx+,idy-);
if (maxn>=b[idy]) printf("false\n");
else printf("maybe\n");
}
}
}

最新文章

  1. 3.C#WinForm基础累加器
  2. pyqt5-为QListWidget添加右键菜单
  3. HDU 4289:Control(最小割)
  4. 多进程模块multiprocessing的使用
  5. HDU 1710 二叉树三种遍历
  6. Xperf Basics: Recording a Trace(转)
  7. [整理]iOS开发学习
  8. centos下的一些命令
  9. HDU 5638 拓扑排序+优先队列
  10. VS查看工程项目代码行数
  11. MVC风格
  12. JAVA学习资料整理
  13. java编码转化方案-备用
  14. 搜索树SVN的树的时候遇到的乱码问题
  15. Windows Server 2008 如何在IIS中添加MIME类型
  16. 打开一个activity,让edittext不获得焦点
  17. ThinkPHP URL伪静态、路由规则、重写、生成
  18. 【技术分享】手把手教你使用PowerShell内置的端口扫描器
  19. PHP call_user_func
  20. DELL、HP、IBM X86服务器命名规则

热门文章

  1. table中td 内容超长 自动折行 (含字母数字文字)
  2. C# 类库下 读取不到config里节点的问题
  3. mysql8.0遇到删除外键的错误
  4. 九、sparkStream的scala示例
  5. TCP/IP Socket发送接收图片demo
  6. php之连接mssql(sql server)新手教程
  7. MyBatis缓存通俗易懂
  8. BZOJ4513: [Sdoi2016]储能表(数位dp)
  9. js中的正则表达式的运用
  10. DOM操作表单(select下拉选框)