bzoj1067降雨量
True和False都好搞
Maybe的情况:
1.Y年和X年的降雨量已知,X年的降雨量不超过Y年的降雨量,从Y+1到X-1年中存在至少一年的降雨量未知,从Y+1到X-1年中已知的降雨量都小于X年的降雨量。
2.Y年和X年中有且仅有一年的降雨量未知,从Y+1到X-1年中已知的降雨量都小于X年的降雨量。
3.Y年和X年的降雨量都未知。
以上三组条件中只要满足任意一组,答案即为”maybe”。
1.5h used
yyc太强辣
#include<cstdio> #include<cstring> #include<map> #include<algorithm> #include<iostream> using namespace std; const int inf=0x373737; map<int,int>dy; map<int,int>dd; int A[100000+10],dmax[100000+10][25],n,cnt[100000+10]; void RMQ_init(){ for(int i=0;i<n;i++) dmax[i][0]=dy[A[i]]; for(int j=1;(1<<j)<=n;j++){ for(int i=0;i+(1<<j)-1<n;i++){ //dmin[i][j]=min(dmin[i][j-1],dmin[i+(1<<(j-1))][j-1]); dmax[i][j]=max(dmax[i][j-1],dmax[i+(1<<(j-1))][j-1]); } } } int rmq(int l,int r){ if(l==r) return dmax[l][0]; int k=0; while((1<<(k+1))<=r-l+1) k++; return max(dmax[l][k],dmax[r-(1<<k)+1][k]); } int main(){ while(~scanf("%d",&n)){ int t=0;dy.clear();dd.clear(); memset(cnt,0,sizeof(cnt)); for(int i=0;i<n;i++){ int a,b;scanf("%d%d",&a,&b); dd[a]=t; A[t++]=a; dy[a]=b; } RMQ_init(); int m;scanf("%d",&m); while(m--){ int x,y;scanf("%d%d",&y,&x); /* if(x<y){ printf("false\n"); continue; } */ int maxx; if(dd.count(x)&&dd.count(y)) maxx=rmq(dd[y]+1,dd[x]-1); if(dd.count(x)&&dd.count(y)){ if(dy[y]>=dy[x]&&(maxx<dy[x]||dd[x]-dd[y]==1)){ if(x-y==dd[x]-dd[y]) printf("true\n"); else printf("maybe\n"); } else printf("false\n"); } else if(dd.count(x)||dd.count(y)){ if(dd.count(x)){ int p=lower_bound(A,A+n,y)-A; //cout<<"pp="<<p<<endl; int maxx=rmq(p,dd[x]-1); //cout<<"maxxx="<<maxx<<endl; if(p==dd[x]||maxx<dy[x]) printf("maybe\n"); else printf("false\n"); } else{ int p=lower_bound(A,A+n,x)-A; //cout<<"p="<<p<<endl; int maxx=rmq(dd[y]+1,p-1); //cout<<"maxx"<<maxx<<endl; if(dd[y]==p-1||maxx<dy[y]) printf("maybe\n"); else printf("false\n"); } } else{ printf("maybe\n"); } } } }