[bzoj1067][SCOI2007]降雨量
呕......这道题直接把我的提交页面刷屏了,一页的红色
#include<iostream> #include<cstdio> #define N 65536 using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();} return x*f; } int n,m; struct YEAR{int num,r;}s[N]; int T[N*2+5]; int query(int l,int r) { // cout<<"query"<<l<<" "<<r<<" "; if(l>r)return 0; int sum=0; for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1) { if(~l&1)sum=max(sum,T[l+1]); if( r&1)sum=max(sum,T[r-1]); } //cout<<sum<<endl; return sum; } int find(int x) { int l=1,r=n,mid=(l+r)>>1,ans=0;; for(;l<=r;mid=(l+r)>>1) { if(s[mid].num>=x) ans=mid,r=mid-1; else l=mid+1; } // cout<<"find"<<x<<" "<<s[ans].num<<endl; return ans; } int main() { n=read(); for(int i=1;i<=n;i++) {s[i].num=read();T[i+N]=s[i].r=read();}s[++n].num=2000000000; m=read();for(int i=N;i;i--)T[i]=max(T[i<<1],T[i<<1|1]); for(int i=1;i<=m;i++) { int y=read(),x=read(),xx=find(x),yy=find(y),ans;xx-=(s[xx].num!=x); if(xx<yy)puts("maybe"); else { ans=query(yy+(s[yy].num==y),xx-(s[xx].num==x)); if(s[yy].num==y&&s[yy].r<=ans) puts("false"); else if(s[xx].num==x&&s[xx].r<=ans) puts("false"); else if(s[yy].num==y&&s[xx].num==x&&s[xx].r>s[yy].r) puts("false"); else if(x-y==xx-yy&&s[xx].num==x&&s[yy].num==y) puts("true"); else puts("maybe"); } } return 0; }
FallDream代表秋之国向您问好!
欢迎您来我的博客www.cnblogs.com/FallDream