线段树专题
来源:互联网 发布: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
- 线段树专题介绍
- 线段树专题
- 【专题属性】线段树
- 【专题】线段树(完整版)
- 线段树专题
- 线段树专题
- poj线段树专题
- 【专题】线段树
- 线段树专题
- 线段树专题
- 线段树专题
- 线段树专题
- 线段树专题
- 线段树专题训练
- 线段树专题
- 线段树专题
- 线段树专题
- 【线段树专题】poj1151
- c++ random_shuffle()
- 【课后简答】ARM嵌入式体系结构与接口技术
- break和continue在语句的作用
- 打开VS2008提示 VMDebuger failed to load的解决办法
- 小浩教你学操作系统
- 线段树专题
- C Tricks(十八)—— 整数绝对值的实现
- phpstorm 2016.2.1 添加php手册详解
- 从TabletoList到Xml、Json序列化
- Python爬虫urllib2笔记(五)数据传送设置HeadersURLError
- 学习工具的使用
- 194. Transpose File
- 学习mysql的第三天
- 总结