hdu 1166 线段树 水题 地兵布阵
越来越感觉算法就是一种方法,一个解决一类问题的公式,当然公式有变形,题也有变形
但只要深刻理解它,变形只是一种顺理而成,只要类比公式,推理一下,将代码变形一下
#include <stdio.h> #include <string.h> #define MAX 50005 struct trea { int l,r; int summ; }trees[MAX*3]; int num[MAX],n,t; void biuld(int i,int l,int r) { trees[i].l=l; trees[i].r=r; if(l==r) { trees[i].summ=num[l-1]; return ; } int mid=(l+r)/2; biuld(i*2,l,mid); biuld(i*2+1,mid+1,r); trees[i].summ=trees[i*2].summ+trees[i*2+1].summ; } void add(int i,int l,int m) { trees[i].summ+=m; if(trees[i].l==l&&trees[i].r==l)return ; int mid=(trees[i].l+trees[i].r)/2; if(l<=mid) add(i*2,l,m); else add(i*2+1,l,m); } int query(int i,int l,int r) { if(trees[i].l==l&&trees[i].r==r) return trees[i].summ; else { int mid=(trees[i].l+trees[i].r)/2; if(l>mid)return query(i*2+1,l,r); else if(r<=mid)return query(i*2,l,r); else return query(i*2,l,mid)+query(i*2+1,mid+1,r); } } int main() { char str[10]; int k=0,i; int a,b; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++)scanf("%d",&num[i]); //for(i=0;i<n;i++)printf("%d\n",num[i]); biuld(1,1,n); printf("Case %d:\n",++k); while(scanf("%s",str)) { if(strcmp(str,"End")==0) break; scanf("%d%d",&a,&b); if(strcmp(str,"Add")==0)add(1,a,b); else if(strcmp(str,"Sub")==0)add(1,a,-b); else { printf("%d\n",query(1,a,b)); } } } return 0; }
就行