来一波数据结构
Posted zhouzhihao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来一波数据结构相关的知识,希望对你有一定的参考价值。
树状数组
#include<bits/stdc++.h> using namespace std; const int MAX=5e5+5; int n,m,c[MAX]; int lowbit(int x) return x&-x; void update(int a,int b) while(a<=n) c[a]+=b; a+=lowbit(a); int sum(int x) int ans=0; while(x>0) ans+=c[x]; x-=lowbit(x); return ans; int main() cin>>n>>m; for(int i=1;i<=n;i++) int x; cin>>x; update(i,x); for(int i=1;i<=m;i++) int k,a,b; scanf("%d%d%d",&k,&a,&b); if(k==2) printf("%d\n",sum(b)-sum(a-1)); else update(a,b); return 0;
ST表(RMQ问题)
#include<bits/stdc++.h> using namespace std; const int MAX=1e6,LOG=25; int n,m; int f[MAX][LOG],logg[MAX]; inline int read() int ans=0,f=1; char c; c=getchar(); while(c<‘0‘ || c>‘9‘) if(c==‘-‘) f=-1; c=getchar(); while(c>=‘0‘ && c<=‘9‘) ans=ans*10+c-‘0‘; c=getchar(); return ans*f; void init() n=read(),m=read(); for(int i=1;i<=n;i++) f[i][0]=read(); logg[0]=-1; for(int i=1;i<=n;i++) logg[i]=logg[i>>1]+1; void st() for(int j=1;j<=LOG;j++) for(int i=1;i+(1<<j)-1<=n;i++) f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]); int main() init(); st(); for(int i=1;i<=m;i++) int x,y; x=read(),y=read(); int s=logg[y-x+1]; printf("%d\n",max(f[x][s],f[y-(1<<s)+1][s])); return 0;
以上是关于来一波数据结构的主要内容,如果未能解决你的问题,请参考以下文章