RT,能给具体一点的解释吗?逛了逛题解区还是没能理解。。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1e5;
int n,m,f[20][maxn+5];
struct node{
int x,y;
}a[maxn];
int maxx(int a,int b)
{
return a>b?a:b;
}
int findit(int x)
{
int l=1,r=n,mid;
while(l<=r)
{
mid=(l+r)/2;
if(a[mid].x==x) return mid;
if(a[mid].x<x) l=mid+1;
else r=mid-1;
}
return -1;
}
int check(int l,int r)
{
int p=log2(r-l+1);
return maxx(f[p][l],f[p][r-(1<<p)+1]);
}
int main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
int p=log2(n);
for(register int i=1;i<=n;i++) f[0][i]=a[i].y;
for(register int i=1;i<=p;i++)
for(register int j=1;j<=n;j++)
f[i][j]=maxx(f[i-1][j],f[i-1][j+(1<<(i-1))]);
scanf("%d",&m);
for(register int i=1;i<=m;i++)
{
int tmp1,tmp2;
scanf("%d%d",&tmp1,&tmp2);
int wei1=findit(tmp1),wei2=findit(tmp2);
if(tmp1>tmp2) {puts("false");continue;}
if(wei1==-1&&wei2==-1)
if(wei1==-1||wei2==-1) {
//?
}
if(a[wei1].y<a[wei2].y) {puts("false");continue;}
if(check(wei1+1,wei2-1)>a[wei2].y) {puts("false");continue;}
if(wei2-wei1+1<tmp2-tmp1+1) {puts("maybe");continue;}
puts("true");
}
return 0;
}
还有一半 RE 了 T-T
可以不要 wyy 回复吗 /kk