来一波数据结构
时间:2019-08-14 23:30:23
收藏:0
阅读:87
树状数组
#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; }
评论(0)