本文共 2195 字,大约阅读时间需要 7 分钟。
①树状数组
#include using namespace std;int n;int c[50010];int lowbit(int x){ return x & -x;}void add(int i,int val)// Add操作,将第i个元素增加val,那么他的父节点也要增加+{ while(i<=n)//注意判断这里不一定是n,这里应该是数值a[i]能达到的最大的值 { c[i]+=val; i+=lowbit(i);//i的父节点 }}int sum(int i){ int s=0; while(i>0) { s+=c[i]; i-=lowbit(i);//I的前驱 } return s;}int main(){ int T; scanf("%d",&T); int x,y; for(int cas=1;cas<=T;++cas) { memset(c,0,sizeof(c)); printf("Case %d:\n",cas); scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&x); add(i,x); } char s[10]; while(scanf("%s",s)) { if(s[0]=='E') break; scanf("%d%d",&x,&y); if(s[0]=='A') add(x,y); else if(s[0]=='S') add(x,-y); else printf("%d\n",sum(y)-sum(x-1));//很像前缀和 } } return 0;}
②线段树
#include #include #include #include #include #include #include #include
转载地址:http://kzfgf.baihongyu.com/