1 条题解
-
0
C++ :
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int d[500010][25],n,m,a[500010],b[500010],x,y,xr,yr,ans; void ST(){ for(int i=1;i<=n;i++) d[i][0]=b[i]; for(int j=1;(1<<j)<=n;j++) for(int i=1;i+(1<<j)-1<=n;i++) d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]); } int ask(int x,int y){ if(x>y) return 0; int k=0; while((1<<(k+1))<=y-x+1) k++; return max(d[x][k],d[y-(1<<k)+1][k]); } int get_lower(int x){ int l=0,r=n,mid; while(l<r){ mid=(l+r+1)>>1; if(x==a[mid]) return mid; if(x>a[mid]) l=mid; else r=mid-1; } return l; } void read(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); a[0]=a[n+1]=-0x3fffffff; ST(); scanf("%d",&m); } int main(){ read(); for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); if(x>y) swap(x,y); xr=get_lower(x); yr=get_lower(y); if(a[xr]!=x&&a[yr]!=y) ans=2; else if(a[xr]!=x){ if(ask(xr+1,yr-1)<b[yr]) ans=2; else ans=0; } else if(a[yr]!=y){ if(ask(xr+1,yr)<b[xr]) ans=2; else ans=0; } else{ if(b[xr]>=b[yr]&&ask(xr+1,yr-1)<b[xr]&&ask(xr+1,yr-1)<b[yr]){ if(yr-xr==y-x) ans=1; else ans=2; } else ans=0; } if(ans==0) puts("false"); else if(ans==1) puts("true"); else puts("maybe"); } return 0; }
- 1
信息
- ID
- 2704
- 时间
- 4000ms
- 内存
- 512MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者