2 条题解
-
1
简单的线段树加分类讨论。
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; int n,m,a[N],w[N],l[N],r[N]; int get1(int x){ return lower_bound(a+1,a+n+1,x)-a; } int get2(int x){ return lower_bound(a+1,a+n+1,x)-a-1; } struct trnode{ int l,r,lc,rc,mx; }tr[2*N]; int trlen; void pushup(int now,int lc,int rc){ tr[now].mx=max(tr[lc].mx,tr[rc].mx); } void build(int nl,int nr){ trlen++;int now=trlen; tr[now]=trnode{nl,nr,-1,-1,0}; if(nl==nr)tr[now].mx=w[nl]; else{ int mid=(nl+nr)>>1; tr[now].lc=trlen+1;build(nl,mid); tr[now].rc=trlen+1;build(mid+1,nr); pushup(now,tr[now].lc,tr[now].rc); } } int query(int now,int nl,int nr,int l,int r){ if(l>r)return 0; if(l<=nl&&nr<=r){ return tr[now].mx; } int mid=(nl+nr)>>1; int lc=tr[now].lc,rc=tr[now].rc; int res=0; if(l<=mid)res=max(res,query(lc,nl,mid,l,r)); if(mid<r)res=max(res,query(rc,mid+1,nr,l,r)); return res; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&a[i],&w[i]); } scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%d%d",&l[i],&r[i]); } build(1,n); for(int i=1;i<=m;i++){ int L=get1(l[i]),R=get2(r[i]); if(a[L]==l[i]){ int res=query(1,1,n,L+1,R); if(a[R+1]==r[i]){ int bk=((R+1-L)==(r[i]-l[i])); if(bk&&res<w[R+1]&&w[R+1]<=w[L]){ puts("true"); } else if(!bk&&res<w[R+1]&&w[R+1]<=w[L]){ puts("maybe"); } else puts("false"); } else{ if(res>=w[L]){ puts("false"); } else puts("maybe"); } } else{ int res=query(1,1,n,L,R); if(a[R+1]==r[i]){ if(res<w[R+1]){ puts("maybe"); } else puts("false"); } else puts("maybe"); } } return 0; }
-
0
#include<bits/stdc++.h> #define il inline #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++) #define Max(a,b) ((a)>(b)?(a):(b)) using namespace std; const int N=200005; int n,m,num[N],ls[N],rs[N]; int ye[N],co[N]; bool f[N]; struct node{ int ans,f; }; il int gi(){ int a=0;char x=getchar();bool f=0; while((x<'0'||x>'9')&&x!='-')x=getchar(); if(x=='-')x=getchar(),f=1; while(x>='0'&&x<='9')a=(a<<3)+(a<<1)+x-48,x=getchar(); return f?-a:a; } il void pushup(int rt){ if(rs[rt<<1]==ls[rt<<1|1]-1)f[rt]=f[rt<<1]&f[rt<<1|1]; rs[rt]=rs[rt<<1|1];ls[rt]=ls[rt<<1]; num[rt]=Max(num[rt<<1],num[rt<<1|1]); } il void build(int l,int r,int rt){ if(l==r){rs[rt]=ls[rt]=ye[l],num[rt]=co[l],f[rt]=1;return;} int m=l+r>>1; build(lson),build(rson); pushup(rt); } il node query(int L,int R,int l,int r,int rt){ if(L<=l&&R>=r){ node tmp; tmp.ans=num[rt],tmp.f=f[rt]; return tmp; } int m=l+r>>1; node tmp; tmp.ans=0,tmp.f=1; if(L<=m){ node x=query(L,R,lson); tmp.ans=Max(tmp.ans,x.ans); tmp.f&=x.f; } if(R>m){ node x=query(L,R,rson); tmp.ans=Max(tmp.ans,x.ans); tmp.f&=x.f; } return tmp; } int main(){ n=gi(); For(i,1,n)ye[i]=gi(),co[i]=gi(); build(1,n,1); m=gi(); int x,y; while(m--){ x=gi(),y=gi(); if(x>=y){printf("false\n");continue;} int st=lower_bound(ye+1,ye+n+1,x)-ye,ed=lower_bound(ye+1,ye+n+1,y)-ye; bool fl,fr;int op=0; fl=ye[st]==x,fr=ye[ed]==y; if(!fl)st--; if(st+1<=ed-1)op=query(st+1,ed-1,1,n,1).ans; if((op>=co[ed]&&fr)||(co[st]<co[ed]&&fl&&fr)||(op>=co[st]&&fl))printf("false\n"); else if(ed-st!=ye[ed]-ye[st]||!fr||!fl)printf("maybe\n"); else printf("true\n"); } return 0; }
- 1
信息
- ID
- 1067
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 32
- 已通过
- 12
- 上传者