【BZOJ1067】【POJ2637】降雨量
1067: [SCOI2007]降雨量
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3004 Solved: 767
[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
首先,妈妈我要报警了,WA了N次,WA一次改一次,主要是分类讨论的问题,所谓谋而后动,根据每个错误点针对性的改错并不能治本,编了一下午,结果晚上不到30min,重新理清思路编了一遍直接A了,思路才是一次编程的核心,思路对了,才为AC奠定基础。但我还是要报警nmb。
ps:心狠累。。具体不写了。。程序清楚明了。。。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 #define N 50000 6 using namespace std; 7 struct data{int mx,lx,rx,k;}seg[N*4]; 8 int n,m,lb,fb,hb,px,py,maxn,ct; 9 int know[N],a[N],rain[N]; 10 void updata(int now) 11 { 12 seg[now].mx=max(seg[(now<<1)].mx,seg[(now<<1)+1].mx); 13 seg[now].k=seg[(now<<1)].k|seg[(now<<1)+1].k; 14 } 15 void buildtree(int now,int l,int r) 16 { 17 seg[now].lx=l; seg[now].rx=r; 18 if (l==r) {seg[now].mx=rain[l]; seg[now].k=know[l]; return;} 19 int mid=(l+r)>>1; 20 buildtree((now<<1),l,mid); 21 buildtree((now<<1)+1,mid+1,r); 22 updata(now); 23 } 24 int query(int now,int begin,int end) 25 { 26 int l=seg[now].lx,r=seg[now].rx; 27 if (begin<=l && end>=r) {hb=hb|seg[now].k; return seg[now].mx;} 28 int mid=(l+r)>>1,ans=0; 29 if (begin<=mid) ans=max(query((now<<1),begin,end),ans); 30 if (end>mid) ans=max(query((now<<1)+1,begin,end),ans); 31 return ans; 32 } 33 int main() 34 { 35 int i; 36 int x,y; 37 scanf("%d",&n); 38 for (i=1;i<=n;i++) 39 { 40 scanf("%d%d",&a[i],&rain[i]); 41 if (a[i]-a[i-1]!=1&&i!=1) know[i]=1; 42 } 43 buildtree(1,1,n); 44 scanf("%d",&m); 45 for (i=1;i<=m;i++) 46 { 47 fb=0; hb=0; lb=0; 48 scanf("%d%d",&x,&y); 49 if (x>=y) {printf("false\n"); continue;} 50 if (y<=a[1]||x>=a[n]) {printf("maybe\n");continue;} 51 px=lower_bound(a+1,a+n+1,x)-a; py=lower_bound(a+1,a+n+1,y)-a; 52 if (a[px]!=x) fb=1; if (a[py]!=y) lb=1; 53 if (fb&&lb) {printf("maybe\n");continue;} 54 if (!fb) 55 if (a[px+1]-a[px]!=1) hb=1; 56 if (!lb) 57 if (a[py]-a[py-1]!=1) hb=1; 58 if (fb&&lb) maxn=query(1,px,py-1); 59 else if (!fb&&lb) maxn=query(1,px+1,py-1); 60 else if (fb&&!lb) maxn=query(1,px,py-1); 61 else if (!fb&&!lb) maxn=query(1,px+1,py-1); 62 if (!fb&&!lb&&!hb&&rain[px]>=rain[py]&&maxn<rain[py]) {printf("true\n");continue;} 63 if (!fb&&!lb&&hb&&rain[px]>=rain[py]&&maxn<rain[py]) {printf("maybe\n");continue;} 64 if (!fb&&lb&&maxn<rain[px]) {printf("maybe\n"); continue;} 65 if (fb&&!lb&&maxn<rain[py]) {printf("maybe\n"); continue;} 66 printf("false\n"); 67 } 68 return 0; 69 }
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 #include <cstring> 6 #define N 50000 7 using namespace std; 8 struct data{int mx,lx,rx,k;}seg[N*4]; 9 int n,m,lb,fb,hb,px,py,maxn,T; 10 int know[N],a[N],rain[N]; 11 void updata(int now) 12 { 13 seg[now].mx=max(seg[(now<<1)].mx,seg[(now<<1)+1].mx); 14 seg[now].k=seg[(now<<1)].k|seg[(now<<1)+1].k; 15 } 16 void buildtree(int now,int l,int r) 17 { 18 seg[now].lx=l; seg[now].rx=r; 19 if (l==r) {seg[now].mx=rain[l]; seg[now].k=know[l]; return;} 20 int mid=(l+r)>>1; 21 buildtree((now<<1),l,mid); 22 buildtree((now<<1)+1,mid+1,r); 23 updata(now); 24 } 25 int query(int now,int begin,int end) 26 { 27 int l=seg[now].lx,r=seg[now].rx; 28 if (begin<=l && end>=r) {hb=hb|seg[now].k; return seg[now].mx;} 29 int mid=(l+r)>>1,ans=0; 30 if (begin<=mid) ans=max(query((now<<1),begin,end),ans); 31 if (end>mid) ans=max(query((now<<1)+1,begin,end),ans); 32 return ans; 33 } 34 int main() 35 { 36 int i; 37 int x,y; 38 while (~scanf("%d",&n)) 39 { 40 if (n==0) break; 41 memset(seg,0,sizeof(seg)); 42 memset(rain,0,sizeof(rain)); 43 memset(know,0,sizeof(know)); 44 memset(a,0,sizeof(a)); 45 for (i=1;i<=n;i++) 46 { 47 scanf("%d%d",&a[i],&rain[i]); 48 if (a[i]-a[i-1]!=1&&i!=1) know[i]=1; 49 } 50 buildtree(1,1,n); 51 scanf("%d",&m); 52 for (i=1;i<=m;i++) 53 { 54 fb=0; hb=0; lb=0; 55 scanf("%d%d",&x,&y); 56 if (x>=y) {printf("false\n"); continue;} 57 if (y<=a[1]||x>=a[n]) {printf("maybe\n");continue;} 58 px=lower_bound(a+1,a+n+1,x)-a; py=lower_bound(a+1,a+n+1,y)-a; 59 if (a[px]!=x) fb=1; if (a[py]!=y) lb=1; 60 if (fb&&lb) {printf("maybe\n");continue;} 61 if (!fb) 62 if (a[px+1]-a[px]!=1) hb=1; 63 if (!lb) 64 if (a[py]-a[py-1]!=1) hb=1; 65 if (fb&&lb) maxn=query(1,px,py-1); 66 else if (!fb&&lb) maxn=query(1,px+1,py-1); 67 else if (fb&&!lb) maxn=query(1,px,py-1); 68 else if (!fb&&!lb) maxn=query(1,px+1,py-1); 69 if (!fb&&!lb&&!hb&&rain[px]>=rain[py]&&maxn<rain[py]) {printf("true\n");continue;} 70 if (!fb&&!lb&&hb&&rain[px]>=rain[py]&&maxn<rain[py]) {printf("maybe\n");continue;} 71 if (!fb&&lb&&maxn<rain[px]) {printf("maybe\n"); continue;} 72 if (fb&&!lb&&maxn<rain[py]) {printf("maybe\n"); continue;} 73 printf("false\n"); 74 } 75 printf("\n"); 76 } 77 return 0; 78 }
—Anime Otaku Save The World.