【資料結構】【線段樹】單點修改區間查詢
阿新 • • 發佈:2018-12-24
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; const int MAXSIZE = 50005; int T,n,x,y,a[MAXSIZE],sum[MAXSIZE*4]; char ask[10]; inline void update(int root) //上傳節點資訊 { sum[root]=sum[root<<1]+sum[root<<1|1]; } void build(int now_root, int l, int r) //建立線段樹 { if (l==r) { sum[now_root]=a[l]; return; } int mid=(l+r)>>1; build(now_root<<1,l,mid); build(now_root<<1|1,mid+1,r); update(now_root); } void modify(int i, int l, int r, int x, int d) //修改:在x處加d { if (l==r) { sum[i]+=d; return; } int mid=(l+r)>>1; if (x<=mid) modify(i<<1,l,mid,x,d); else modify(i<<1|1,mid+1,r,x,d); update(i); } int query(int i, int l, int r, int L, int R) //詢問L到R區間和 { if (L<=l&&r<=R) return sum[i]; int mid=(l+r)>>1; int ans=0; if (L<=mid) ans+=query(i<<1,l,mid,L,R); if (mid<R) ans+=query(i<<1|1,mid+1,r,L,R); return ans; } int main() { scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&a[i]); build(1,1,n); //建立線段樹 scanf("%s",ask+1); //讀入操作命令:Add,Query,End while(ask[1]!='E') { scanf("%d%d",&x,&y); if (ask[1]=='A') modify(1,1,n,x,y); //在x處加y if (ask[1]=='Q') printf("%d\n",query(1,1,n,x,y)); //詢問x到y區間和 scanf("%s",ask+1); } return 0; }
這是HDU1166修改後的模板,用線段樹維護區間和,支援單點修改和區間查詢操作