所以查询的有一个年份未出现的情况怎么搞哇
查看原帖
所以查询的有一个年份未出现的情况怎么搞哇
320815
STL_Lover楼主2020/8/14 17:15

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

2020/8/14 17:15
加载中...