单调栈:
#include<bits/stdc++.h> using namespace std;
懒得写,放个头文件看着整齐。
ST表:
#include<bits/stdc++.h> using namespace std; int n,m; int a[1000005][22]; int query(int l,int r) { int k=log2(r-l+1); return max(a[l][k],a[r-(1<<k)+1][k]); } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { scanf("%d",&a[i][0]); } for(int j=1;j<=21;j++) { for(int i=1;i+(1<<j)-1<=n;i++) { a[i][j]=max(a[i][j-1],a[i+(1<<(j-1))][j-1]); } } for(int i=0;i<m;i++) { int l,r; scanf("%d %d",&l,&r); printf("%d\n",query(l,r)); } return 0; }
树状数组:
int n,a[10000],c[10000];//a is the original array and c is the tree array int lowbit(int x) { return x&(-x); } void updata(int i,int k)//add k to pos[i] of original array { while(i<=n) { c[i]+=k; i+=lowbit(i); } } int getsum(int i)//get the sum of from a[1] to a[i] { int ans=0; while(i>0) { ans+=c[i]; i-=lowbit(i); } return ans; }
线段树:
#define maxn 100007 int sum[maxn<<2],a[maxn]; void merge(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void build(int l,int r,int rt) { if(l==r) { sum[rt]=a[l];return; } int m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,rt<<1|1); merge(rt); } void update(int x,int c,int l,int r,int rt)//a[x]+=c { if(l==r) { sum[rt]+=c;return; } int m=(l+r)>>1; if(x<=m) update(x,c,l,m,rt<<1); else update(x,c,m+1,r,rt<<1|1); merge(rt); } int getsum(int L,int R,int l,int r,int rt) { if(L<=l&&R>=r) return sum[rt]; int m=(l+r)>>1,ans=0; if(L<=m) ans+=getsum(L,R,l,m,rt<<1); if(R>m) ans+=getsum(L,R,m+1,r,rt<<1|1); return ans; }