ST表
int main() { cin>>n>>m; for(int i=1;i<=n;i++)d[i][0]=read(); for(int j=1;(1<<j)<=n;j++) for(int i=1;i-1+(1<<j)<=n;i++) d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]); while(m--) { l=read();r=read(); k=log2(r-l+1); printf("%d ",max(d[l][k],d[r-(1<<k)+1][k])); } }
LCA
#include<bits/stdc++.h> using namespace std; int n,m,ne,head[1000100],x,y,q,t,a,b,dep[1000100],fa[1000100][22]; struct node{int nxt,to;}eg[1000100*2]; void adde(int f,int v){eg[++ne].to=v;eg[ne].nxt=head[f];head[f]=ne;} void dfs(int u,int father) { for(int i=head[u];i;i=eg[i].nxt) if(eg[i].to!=father) {int v=eg[i].to; dep[v]=dep[u]+1;fa[v][0]=u;dfs(v,u);} } int lca(int x,int y) { if(dep[x]<dep[y])swap(x,y); for(int i=20;i>=0;i--) if(dep[fa[x][i]]>=dep[y])x=fa[x][i]; if(x==y)return x; for(int i=20;i>=0;i--) if(fa[x][i]!=fa[y][i]) { x=fa[x][i]; y=fa[y][i]; } return fa[x][0]; } int main() { cin>>n>>q>>t;dep[t]=1; for(int i=1;i<=n-1;i++) {cin>>a>>b;adde(a,b);adde(b,a);} dfs(t,t);fa[t][0]=t; for(int i=1;i<=20;i++) for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1]; while(q--) { scanf("%d%d",&x,&y); printf("%d ",lca(x,y)); } }
线段树
#include<bits/stdc++.h> using namespace std; #define ln now<<1 #define rn (now<<1)+1 int n,m,a,b,c,cnt,d; long long sum[400040],num[400040],tag[400040]; void pushdown(int now,int l,int r) { if(tag[now]) { int mid=(l+r)>>1; sum[ln]+=(tag[now]*(mid-l+1));sum[rn]+=(tag[now]*(r-mid)); tag[ln]+=tag[now];tag[rn]+=tag[now]; tag[now]=0;sum[now]=sum[ln]+sum[rn]; } } void build(int now,int l,int r) { if(l==r)sum[now]=num[++cnt]; else{ int mid=(l+r)/2; build(ln,l,mid); build(rn,mid+1,r); sum[now]=sum[ln]+sum[rn]; } } void add(int now,int ll,int rr,int l,int r,int val) { if(l<=ll&&r>=rr) { sum[now]+=(val*(rr-ll+1)); tag[now]+=val; } else{ pushdown(now,ll,rr); int mid=(ll+rr)/2; if(l<=mid)add(ln,ll,mid,l,r,val); if(r>mid)add(rn,mid+1,rr,l,r,val); sum[now]=sum[ln]+sum[rn]; } } long long gsum(int now,int ll,int rr,int l,int r) { long long ans=0; if(l<=ll&&r>=rr)ans+=sum[now]; else{ pushdown(now,ll,rr); int mid=(ll+rr)/2; if(l<=mid)ans+=gsum(ln,ll,mid,l,r); if(r>mid)ans+=gsum(rn,mid+1,rr,l,r); sum[now]=sum[ln]+sum[rn]; } return ans; } int main() { cin>>n>>m; for(int i=1;i<=n;i++)cin>>num[i]; build(1,1,n); while(m--) { cin>>a>>b>>c; if(a==1) { cin>>d; add(1,1,n,b,c,d); } else cout<<gsum(1,1,n,b,c)<<endl; } }