bzoj 1067: [SCOI2007]降雨量
来源:互联网 发布:迪杰斯特拉算法讲解 编辑:程序博客网 时间:2024/06/05 08:00
1067: [SCOI2007]降雨量
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3349 Solved: 862
[Submit][Status][Discuss]
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
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
true
false
maybe
false
HINT
100%的数据满足:1<=n<=50000, 1<=m<=10000, -10^9<=yi<=10^9, 1<=ri<=10^9
Source
POJ 2637 WorstWeather Ever
如果读入的两个数不是连续的,那么就在他们中间加入一个中间年份,把降雨量值付为0, 然后如果区间最小值为0,就说明两个年份之间有未知年份,这样就进行各种分类讨论,乱搞一下就好了。分类讨论特别容易漏情况,特别容易出错。。。。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define N 100003using namespace std;int n,m;int y[N],num[N],a[N],c[N],tot,tr[N*4],tr1[N*4];void update(int x){ tr[x]=max(tr[x<<1],tr[x<<1|1]); tr1[x]=min(tr1[x<<1],tr1[x<<1|1]);}void build(int now,int l,int r){ if(l==r) { tr[now]=tr1[now]=c[l]; return; } int mid=(l+r)/2; build(now<<1,l,mid); build(now<<1|1,mid+1,r); update(now);}int qjmax(int now,int l,int r,int ll,int rr){ if (l>=ll&&r<=rr) return tr[now]; int mid=(l+r)/2; int ans=0; if (ll<=mid) ans=max(ans,qjmax(now<<1,l,mid,ll,rr)); if (rr>mid) ans=max(ans,qjmax(now<<1|1,mid+1,r,ll,rr)); return ans;}int qjmin(int now,int l,int r,int ll,int rr){ if (l>=ll&&r<=rr) return tr1[now]; int mid=(l+r)/2; int ans=1e9; if (ll<=mid) ans=min(ans,qjmin(now<<1,l,mid,ll,rr)); if (rr>mid) ans=min(ans,qjmin(now<<1|1,mid+1,r,ll,rr)); return ans;}int main(){ scanf("%d",&n); int x,y1; scanf("%d%d",&x,&y1); tot++; a[tot]=tot; c[tot]=0; y[tot]=x-1; tot++; a[tot]=tot; c[tot]=y1; y[tot]=x; num[1]=x; for (int i=2;i<=n;i++) { int x,y1; scanf("%d%d",&num[i],&y1); if (num[i]!=num[i-1]+1) { tot++; a[tot]=tot; c[tot]=0; y[tot]=num[i-1]+1; } tot++; a[tot]=tot; c[tot]=y1; y[tot]=num[i]; } build(1,1,tot); scanf("%d",&m); for (int i=1;i<=m;i++) { int x,y1; scanf("%d%d",&x,&y1); int k=lower_bound(y+1,y+tot+1,x)-y; if (y[k]>x) k--; int l=lower_bound(y+1,y+tot+1,y1)-y; if (k==l-1) if (y[k]==x&&y[l]==y1&&c[k]&&c[l]) { if (c[k]>=c[l]) { printf("true\n"); continue; } printf("false\n"); continue; } else { printf("maybe\n"); continue; } int minn=qjmin(1,1,tot,k+1,l-1); int maxn=qjmax(1,1,tot,k+1,l-1); if ((y[k]!=x||c[k]==0)&&(y[l]!=y1||c[l]==0)) { printf("maybe\n"); continue; } if ((y[k]!=x||c[k]==0)&&y[l]==y1) { if (maxn>=c[l]) printf("false\n"); else printf("maybe\n"); continue; } if ((y[l]!=y1||c[l]==0)&&y[k]==x) { if (c[k]<=maxn) printf("false\n"); else printf("maybe\n"); continue; } if (maxn>=c[l]||c[k]<=maxn||c[l]>c[k]){ printf("false\n"); continue; } if(!minn) { printf("maybe\n"); continue; } printf("true\n"); }}
数据生成器
#include<iostream>#include<cstdio>#include<cstdlib>#include<ctime>#include<algorithm>#include<map>using namespace std;int a[1000];map<int,int> mp;int main(){ freopen("ok.in","w",stdout); int n=200; int m=200; int p=2*n; cout<<n<<endl; int x; srand(time(0)); for (int i=1;i<=n;i++) { x=rand()%p+1; while (mp[x]) x=rand()%p+1; mp[x]=1; a[i]=x; } sort(a+1,a+n+1); for (int i=1;i<=n;i++) { cout<<a[i]<<" "<<rand()<<endl; } cout<<m<<endl; for (int i=1;i<=m;i++) { int x,y; x=rand()%p+1; y=rand()%p+2; if (x==y) y++; if (x>y) swap(x,y); cout<<x<<" "<<y<<endl; }}
0 0
- 【BZOJ 1067】 [SCOI2007]降雨量
- bzoj 1067: [SCOI2007]降雨量
- bzoj 1067 [SCOI2007]降雨量
- bzoj 1067: [SCOI2007]降雨量
- [bzoj] 1067: [SCOI2007]降雨量
- BZOJ 1067: [SCOI2007]降雨量
- BZOJ 1067 [SCOI2007]降雨量 RMQ
- bzoj 1067: [SCOI2007]降雨量 RMQ+讨论
- BZOJ 1067 [SCOI2007]降雨量 线段树
- 【BZOJ 1067】[SCOI2007]降雨量 线段树
- [bzoj][SCOI2007]降雨量
- bzoj[SCOI2007]降雨量
- 1067: [SCOI2007]降雨量
- 1067: [SCOI2007]降雨量
- BZOJ 1067: [SCOI2007]降雨量 二分,RM0Q预处理,分类讨论
- scoi2007降雨量
- 【SCOI2007】降雨量
- [SCOI2007]降雨量
- CentOS安装中文支持包
- 从关系型数据库到非关系型数据库
- 无责任共享 Coursera、Udacity 等课程视频
- java面向对象_内存分析1
- 第六周作业 IP地址类
- bzoj 1067: [SCOI2007]降雨量
- 【excel处理技巧】如何在Excel中快速辨别两列数据是否一致的五种方法介绍
- IDEA 快捷键
- numpy教程:快速傅里叶变换模块numpy.fft
- c++之函数特性 重载 内联 函数默认值
- 动态规划之Charm Bracelet
- Chapter3-图像变换-(1)傅里叶变换
- 协同过滤算法
- Cocos2d-x 3.9教程:7. Cocos2d-x中的控件