线段树专题

来源:互联网 发布:ubuntu 文件权限设置 编辑:程序博客网 时间:2024/06/10 02:39

  • HDU 1166 敌兵布阵
  • HDU 1394 Minimum Inversion Number
  • HDU 1698 Just a Hook
  • POJ 3468 A Simple Problem with Integers
  • POJ 3225 Help with Intervals
  • POJ 3667 Hotel
  • BZOJ 1067 降雨量

HDU 1166 敌兵布阵

单点加减区间求和

#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,0x3f,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define MEMx(a,b) memset(a,b,sizeof(a));#define INF (0x3f3f3f3f)#define F (1000000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define Pr(kcase) printf("Case %d:\n",kcase);#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;#define PRi2D(a,n,m) For(i,n) { \                        For(j,m-1) cout<<a[i][j]<<' ';\                        cout<<a[i][m]<<endl; \                        } #pragma comment(linker, "/STACK:102400000,102400000")typedef long long ll;typedef long double ld;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return ((a-b)%F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} const int maxn =60000;int sum[maxn<<2],a[maxn];;void pushup(int o) {    sum[o]=sum[Lson]+sum[Rson];}void build(int l,int r,int o) {    if (l==r) {        sum[o]=a[l];    return ;    }    int m=(l+r)>>1;    build(l,m,Lson),build(m+1,r,Rson);    pushup(o);}void update(int l,int r,int o,int p,int v) {    if (l==r) {        sum[o]+=v;  return;    }    int m=(l+r)>>1;    if (p<=m) update(l,m,Lson,p,v);     else update(m+1,r,Rson,p,v);    pushup(o);}int query(int l,int r,int o,int L,int R) {    if(L<=l && r<=R ) return sum[o];    int m=(l+r)>>1;    int ret=0;    if(L<=m) ret+=query(l,m,Lson,L,R);    if(m<R) ret+=query(m+1,r,Rson,L,R);     return ret;}int main(){//  freopen("hdu1166.in","r",stdin);//  freopen(".out","w",stdout);    int T=read();    For(kcase,T) {  Pr(kcase)        int n=read();        For(i,n) a[i]=read();        build(1,n,1);        char s[10];        while(scanf("%s",s)&&s[0]!='E') {            int p1=read(),p2=read();            switch(s[0]){                case'Q':{                    cout<<query(1,n,1,p1,p2)<<endl;                    break;                }                default:{                    if (s[0]=='S') p2=-p2;                    update(1,n,1,p1,p2);                }            }        }    }       return 0;}

HDU 1394 Minimum Inversion Number

最小位移逆序对数
先求出逆序对数,后面直接O(1)计算

#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,0x3f,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define MEMx(a,b) memset(a,b,sizeof(a));#define INF (0x3f3f3f3f)#define F (1000000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define Pr(kcase) printf("Case %d:\n",kcase);#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;#define PRi2D(a,n,m) For(i,n) { \                        For(j,m-1) cout<<a[i][j]<<' ';\                        cout<<a[i][m]<<endl; \                        } #pragma comment(linker, "/STACK:102400000,102400000")typedef long long ll;typedef long double ld;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return ((a-b)%F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} const int maxn =60000;int sum[maxn<<2],a[maxn];;void pushup(int o) {    sum[o]=sum[Lson]+sum[Rson];}void build(int l,int r,int o) {    if (l==r) {        sum[o]=0;   return ;    }    int m=(l+r)>>1;    build(l,m,Lson),build(m+1,r,Rson);    pushup(o);}void update(int l,int r,int o,int p,int v) {    if (l==r) {        sum[o]+=v;  return;    }    int m=(l+r)>>1;    if (p<=m) update(l,m,Lson,p,v);     else update(m+1,r,Rson,p,v);    pushup(o);}int query(int l,int r,int o,int L,int R) {    if(L<=l && r<=R ) return sum[o];    int m=(l+r)>>1;    int ret=0;    if(L<=m) ret+=query(l,m,Lson,L,R);    if(m<R) ret+=query(m+1,r,Rson,L,R);     return ret;}int main(){//  freopen("hdu1394.in","r",stdin);//  freopen(".out","w",stdout);    int n;    while(cin>>n) {        For(i,n) a[i]=read();        build(0,n-1,1);        int ans=0;        For(i,n) {            ans+=query(0,n-1,1,a[i],n-1);            update(0,n-1,1,a[i],1);        }        int cnt=ans;        For(i,n) {            if (a[i]>0) cnt-=a[i];            if (a[i]<n-1) cnt+=n-1-a[i];            ans=min(ans,cnt);        }        cout<<ans<<endl;    }    return 0;}

HDU 1698 Just a Hook

#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,0x3f,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define MEMx(a,b) memset(a,b,sizeof(a));#define INF (0x3f3f3f3f)#define F (1000000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;#define PRi2D(a,n,m) For(i,n) { \                        For(j,m-1) cout<<a[i][j]<<' ';\                        cout<<a[i][m]<<endl; \                        } #pragma comment(linker, "/STACK:102400000,102400000")typedef long long ll;typedef long double ld;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return ((a-b)%F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} #define MAXN (200000+10)int col[MAXN<<2],sum[MAXN<<2];void pushUp(int o) {    sum[o]=sum[Lson] + sum[Rson];}void pushDown(int o,int m) {    if (col[o]) {        col[Lson]=col[Rson]=col[o];        sum[Lson]=(m-(m>>1))*col[o];        sum[Rson]=(m>>1)* col[o];        col[o]=0;    }} void build(int l,int r,int o) {    col[o]=0,sum[o]=1;    if (l==r) return;    int m=(l+r)>>1;    build(l,m,Lson);    build(m+1,r,Rson);    pushUp(o);}void update(int l,int r,int o,int L,int R,int c) {    if (L<=l&&r<=R) {        col[o]=c;        sum[o]=c*(r-l+1);        return;    }    pushDown(o,r-l+1);    int m=(l+r)>>1;    if (L<=m) update(l,m,Lson,L,R,c);    if (m<R) update(m+1,r,Rson,L,R,c);    pushUp(o);}int main(){//  freopen("hdu1698.in","r",stdin);//  freopen(".out","w",stdout);    int T = read();    For(kcase,T) {        int n=read(),m=read();        build(1,n,1);        while(m--) {            int a=read(),b=read(),c=read();            update(1,n,1,a,b,c);        }        printf("Case %d: The total value of the hook is %d.\n",kcase,sum[1]);    }       return 0;}

POJ 3468 A Simple Problem with Integers

区间加,区间求和
经典中的经典

#include<cstdio>#include<cctype>#include<iostream>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,0x3f,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define MEMx(a,b) memset(a,b,sizeof(a));#define INF (0x3f3f3f3f)#define F (1000000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;#define PRi2D(a,n,m) For(i,n) { \                        For(j,m-1) cout<<a[i][j]<<' ';\                        cout<<a[i][m]<<endl; \                        } #pragma comment(linker, "/STACK:102400000,102400000")typedef long long ll;typedef long double ld;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return ((a-b)%F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} #define MAXN (200000+10)ll addv[MAXN<<2],sum[MAXN<<2];void pushUp(int o) {    sum[o]=sum[Lson] + sum[Rson];}void pushDown(int o,ll m) {    if (addv[o]) {        addv[Lson]+=addv[o];addv[Rson]+=addv[o];        sum[Lson]+=(m-(m>>1))*addv[o];        sum[Rson]+=(m>>1)* addv[o];        addv[o]=0;    }} void build(int l,int r,int o) {    addv[o]=0;    if (l==r) {        sum[o]=read();        return;    }    int m=(l+r)>>1;    build(l,m,Lson);    build(m+1,r,Rson);    pushUp(o);}void update(int l,int r,int o,int L,int R,ll c) {    if (L<=l&&r<=R) {        addv[o]+=c;        sum[o]+=c*(r-l+1);        return;    }    pushDown(o,r-l+1);    int m=(l+r)>>1;    if (L<=m) update(l,m,Lson,L,R,c);    if (m<R) update(m+1,r,Rson,L,R,c);    pushUp(o);}ll query(int l,int r,int o,int L,int R) {    if (L<=l && r<=R) {        return sum[o];    }    pushDown(o,r-l+1);    int m=(l+r)>>1;    ll ret=0;    if (L<=m) ret+=query(l,m,Lson,L,R);    if (m<R) ret+=query(m+1,r,Rson,L,R);    return ret; }int main(){//  freopen("poj3468.in","r",stdin);//  freopen(".out","w",stdout);    int n=read(),m=read();    build(1,n,1);    while(m--) {        char op[2]; int a,b;        scanf("%s%d%d",op,&a,&b);        if (op[0]=='Q') cout<<query(1,n,1,a,b)<<endl;        else update(1,n,1,a,b,read());    }       return 0;}

POJ 3225 Help with Intervals

Command Semantics
U T S ← S ∪ T
I T S ← S ∩ T
D T S ← S − T
C T S ← T − S
S T S ← S ⊕ T

给定集合操作,维护区间
其实可以把操作化简为区间xor和区间赋值2类

#include<cstdio>#include<cctype>#include<iostream>#include<cstring>#include<vector>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,0x3f,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define MEMx(a,b) memset(a,b,sizeof(a));#define INF (0x3f3f3f3f)#define F (1000000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;#define PRi2D(a,n,m) For(i,n) { \                        For(j,m-1) cout<<a[i][j]<<' ';\                        cout<<a[i][m]<<endl; \                        } #pragma comment(linker, "/STACK:102400000,102400000")typedef long long ll;typedef long double ld;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return ((a-b)%F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} #define MAXN (200000+10)int cover[MAXN<<2],XOR[MAXN<<2];void FXOR(int o) {    if (cover[o]==-1) XOR[o]^=1;    else cover[o]^=1;}void pushDown(int o,ll m) {    if (cover[o]!=-1) {        cover[Lson]=cover[Rson]=cover[o];        XOR[Lson]=XOR[Rson]=0;        cover[o]=-1;    } else if (XOR[o]) {        FXOR(Lson);FXOR(Rson);        XOR[o]=0;    }} void update(int l,int r,int o,int L,int R,int op) {    if (L<=l&&r<=R) {        if (op=='U') cover[o]=1,XOR[o]=0;        else if (op=='D') cover[o]=XOR[o]=0;        else if (op=='C'||op=='S') FXOR(o);        return;    }    pushDown(o,r-l+1);    int m=(l+r)>>1;    if (L<=m) update(l,m,Lson,L,R,op);    else if (op=='I'||op=='C') cover[Lson]=XOR[Lson]=0;    if (m<R) update(m+1,r,Rson,L,R,op);    else if (op=='I'||op=='C') cover[Rson]=XOR[Rson]=0;}vi v;void query(int l,int r,int o) {    if (cover[o]!=-1) {        if (cover[o]==1) Fork(i,l,r) v.pb(i);        return;    }    pushDown(o,r-l+1);    int m=(l+r)>>1;    query(l,m,Lson);    query(m+1,r,Rson);}int main(){//  freopen("poj3225.in","r",stdin);//  freopen(".out","w",stdout);    cover[1]=XOR[1]=0;    int n=65535<<1;    char op,l,r; int a,b;    while(~scanf("%c %c%d,%d%c\n",&op,&l,&a,&b,&r)) {        a<<=1,b<<=1;        if (l=='(') ++a; if (r==')') --b;        if(a>b && (op=='I'||op=='C') )  cover[1]=XOR[1]=0;        else update(0,n,1,a,b,op);    }    query(0,n,1);    int sz=SI(v);    if (!sz) puts("empty set");    else {        int s=v[0],e=v[0];        For(i,sz-1) {            if (v[i]==e+1) e++;            else {                printf("%c%d,%d%c ",s&1?'(':'[', s>>1, (e+1)>>1, e&1?')':']');                s=e=v[i];            }        }        printf("%c%d,%d%c\n",s&1?'(':'[', s>>1, (e+1)>>1, e&1?')':']');    }    return 0;}

POJ 3667 Hotel

区间修改,找区间最早出现连续w个0的位置

#include<cstdio>#include<cctype>#include<iostream>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,0x3f,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define MEMx(a,b) memset(a,b,sizeof(a));#define INF (0x3f3f3f3f)#define F (1000000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;#define PRi2D(a,n,m) For(i,n) { \                        For(j,m-1) cout<<a[i][j]<<' ';\                        cout<<a[i][m]<<endl; \                        } #pragma comment(linker, "/STACK:102400000,102400000")typedef long long ll;typedef long double ld;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return ((a-b)%F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} #define MAXN (500000+10)ll cover[MAXN<<2],lsum[MAXN<<2],rsum[MAXN<<2],msum[MAXN<<2];void pushUp(int o,int m) {    lsum[o]=lsum[Lson];    rsum[o]=rsum[Rson];    if (lsum[o]==m-(m>>1)) lsum[o]+=lsum[Rson];    if (rsum[o]==(m>>1)) rsum[o]+=rsum[Lson];    msum[o]=max(msum[Lson], max(msum[Rson], rsum[Lson]+lsum[Rson]));}void pushDown(int o,ll m) {    if (cover[o]!=-1) {        cover[Lson]=cover[Rson]=cover[o];        msum[Lson]=lsum[Lson]=rsum[Lson]=(m-(m>>1))*cover[o];        msum[Rson]=lsum[Rson]=rsum[Rson]=(m>>1)*cover[o];        cover[o]=-1;    }} void build(int l,int r,int o) {    cover[o]=-1;    msum[o]=lsum[o]=rsum[o]=r-l+1;    if (l==r) {        return;    }    int m=(l+r)>>1;    build(l,m,Lson);    build(m+1,r,Rson);    pushUp(o,r-l+1);}void update(int l,int r,int o,int L,int R,int c) {    if (L<=l&&r<=R) {        cover[o]=c;        msum[o]=lsum[o]=rsum[o]=(r-l+1)*c;        return;    }    pushDown(o,r-l+1);    int m=(l+r)>>1;    if (L<=m) update(l,m,Lson,L,R,c);    if (m<R) update(m+1,r,Rson,L,R,c);    pushUp(o,r-l+1);}int query(int l,int r,int o,int w) {    if (l==r) return l;    pushDown(o,r-l+1);    int m=(l+r)>>1;    if (msum[Lson]>=w) return query(l,m,Lson,w);    else if (rsum[Lson]+lsum[Rson]>=w) return m-rsum[Lson]+1;    return query(m+1,r,Rson,w); }int main(){//  freopen("poj3667.in","r",stdin);//  freopen(".out","w",stdout);    int n=read(),m=read();    build(1,n,1);    while(m--) {        int op; int a,b;        scanf("%d%d",&op,&a);        if (op==1) {            if (msum[1]<a) puts("0");            else {                int p=query(1,n,1,a);                cout<<p<<endl;                update(1,n,1,p,p+a-1,0);            }         } else {            int b=read();            update(1,n,1,a,a+b-1,1);        }    }       return 0;}

BZOJ 1067 降雨量

需要特判各种情况
注意边界
边界均未知:maybe
一边边界已知:中间没有超过的数?maybe:false
两边边界均已知:中间没有超过的数?(中间数全已知?true:false):maybe

#include<cstdio>#include<cctype>#include<iostream>#include<algorithm>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,0x3f,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define MEMx(a,b) memset(a,b,sizeof(a));#define INF (0x3f3f3f3f)#define F (1000000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;#define PRi2D(a,n,m) For(i,n) { \                        For(j,m-1) cout<<a[i][j]<<' ';\                        cout<<a[i][m]<<endl; \                        } #pragma comment(linker, "/STACK:102400000,102400000")typedef long long ll;typedef long double ld;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return ((a-b)%F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} #define MAXN (50000+10)const int maxn =50010;int sum[maxn<<2],a[maxn<<2],maxv[maxn<<2];int year[MAXN<<2];void pushup(int o) {    sum[o]=sum[Lson]+sum[Rson];    maxv[o]=max(maxv[Lson],maxv[Rson]);}void build(int l,int r,int o) {    if (l==r) {        year[l]=read();        sum[o]=maxv[o]=a[l]=read(); return ;    }    int m=(l+r)>>1;    build(l,m,Lson),build(m+1,r,Rson);    pushup(o);}int query(int l,int r,int o,int L,int R) {    if(L<=l && r<=R ) return maxv[o];    int m=(l+r)>>1;    int ret=0;    if(L<=m) ret=max(ret,query(l,m,Lson,L,R));    if(m<R) ret=max(ret,query(m+1,r,Rson,L,R));     return ret;}int n,m;int find(int x){return lower_bound(year+1,year+1+n,x) -year;}int work() {    int x=read(),y=read();    int p1=find(x),p2=find(y);    bool b1= year[p1] == x, b2 = year[p2] == y;    if (!b1&&!b2) return 2;    if (b1&b2) {        if (a[p2]>a[p1]) return 0;        bool b  = (p1+1>p2-1) || query(1,n,1,p1+1,p2-1)<a[p2];        if (!b) return 0;        if (b&&p2-p1==y-x) return 1;        return 2;                   } else if (b1&!b2) {        bool b  = (p1+1>p2-1) || query(1,n,1,p1+1,p2-1)<a[p1];        if (!b) return 0;        return 2;    } else if (!b1&b2){        bool b  = (p1>p2-1) || query(1,n,1,p1,p2-1)<a[p2];        if (!b) return 0;        return 2;    }}int main(){//  freopen("bzoj1067.in","r",stdin);//  freopen(".out","w",stdout);    n=read();    year[0]=-1e9-1;year[n+1]=1e9+1;    build(1,n,1);    m=read();    while(m--) {        int p=work();        puts((!p)?"false":((p==1)?"true":"maybe"  ));       }       return 0;}
0 0
原创粉丝点击