敌国布阵(线段树)
来源:互联网 发布:python数据采集 pdf 编辑:程序博客网 时间:2024/06/10 07:10
#include<stdio.h>#define maxn 50005struct Tree{ int left,right,sum; }tr[maxn*3];int array[maxn];void build(int l,int r,int now){ tr[now].left=l; tr[now].right=r; if(l==r) { tr[now].sum=array[l]; return; } int mid=(l+r)/2; build(l,mid,now*2); build(mid+1,r,(now*2)+1); tr[now].sum=tr[now*2].sum+tr[now*2+1].sum;}void update(int now,int goal,int add){ if(tr[now].left==tr[now].right) { tr[now].sum+=add; return ;} int mid=(tr[now].left+tr[now].right)/2; if(goal<=mid) { update(now*2,goal,add); } else update(now*2+1,goal,add); tr[now].sum=tr[now*2].sum+tr[now*2+1].sum;}int query(int start,int end,int now){ if(start<=tr[now].left && tr[now].right<=end) { return tr[now].sum;} int ans=0; int mid=(tr[now].left+tr[now].right)/2; if(start<=mid) { ans+=query(start,end,now*2); } if(end>mid) ans+=query(start,end,now*2+1); return ans;}int main(){ int t,i,j,k,n,a,b,p,number; char str[10]; //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); scanf("%d",&t); for(k=1;k<=t;k++) { printf("Case %d:\n",k); scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&array[i]); build(1,n,1); //for(i=1;i<=n*3;i++) // printf("%d %d %d\n",tr[i].left,tr[i].right,tr[i].sum); // printf("\n................\n"); while(scanf("%s",str)) { if(str[0]=='E') break; if(str[0]=='Q') { scanf("%d %d",&a,&b); printf("%d\n",query(a,b,1)); } if(str[0]=='A') { scanf("%d %d",&p,&number); update(1,p,number); } if(str[0]=='S') { scanf("%d %d",&p,&number); update(1,p,-number); } } } }
再次复习线段树,主要是改善风格和完善代码。
#include <stdio.h>#include <string.h>#define maxn 50050#define lson l , m , rt*2#define rson m+1 , r , rt*2+1int n;int sum[maxn<<2];int in[maxn];void PushUp(int rt){sum[rt]= sum[rt*2] + sum[rt*2+1];}void build(int l, int r, int rt){if(l == r) {sum[rt] = in[l];return ;}int m = (l + r)/ 2;build(lson);build(rson);PushUp(rt);}int query(int L,int R,int l,int r,int rt){if(L <= l && r <= R)return sum[rt];int m = (l + r) / 2;int ret = 0;if(L <= m) ret += query(L,R,lson);if(R > m) ret += query(L,R,rson);return ret;}void update(int index,int add,int l,int r,int rt){if(l == r){sum[rt] += add;return ;}int m = (l + r) / 2;if(index <= m) update(index ,add ,lson);else update(index ,add , rson);PushUp(rt);}int main(){int T,i,cas=1;char op[10];scanf("%d",&T);while(T--){printf("Case %d:\n",cas++);scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&in[i]);getchar();build(1,n,1);while(scanf("%s",op)){if(op[0]=='E')break;int a,b;scanf("%d%d",&a,&b);if(op[0]=='Q')printf("%d\n",query(a,b,1,n,1));else if(op[0] == 'S') update(a,-b,1,n,1);else update(a,b,1,n,1); } }}
- 敌国布阵(线段树)
- 敌兵布阵(线段树)
- 敌兵布阵(线段树)
- 线段树(敌兵布阵)
- 敌兵布阵(线段树)
- 敌兵布阵(线段树)
- 敌兵布阵(线段树)
- 敌兵布阵(线段树)
- HDOJ 敌兵布阵 (线段树解法)
- HDOJ 1166 敌兵布阵 (线段树)
- HDU-1166-敌兵布阵(线段树)
- 【hdu】 敌兵布阵 (线段树)
- 敌兵布阵(树状数组、线段树)
- HDU 1166敌兵布阵(线段树)
- hdu_1166 敌兵布阵(线段树)
- HDU 1166 敌兵布阵 (线段树)
- hdu1166 敌兵布阵(线段树)
- hdu1166-敌兵布阵(线段树)
- Efficient C Tips #6 – Don’t use the ternary operator
- 素数筛选与快速幂取模
- 一道中兴笔试题
- “NETDEV WATCHDOG: eth0: transmit timed out” 后网卡当掉
- FIREFOX与IE兼容性探讨
- 敌国布阵(线段树)
- java内存管理的学习笔记
- mysql 查询替换
- Tempter of the Bone 奇偶剪枝(深搜)
- Extjs继承机制和窗体创建(10级学员 刘根鹏课堂总结)
- Oil Deposits (广搜)
- 让程序更高效的10种方法
- 学习杭电大牛的线段树风格
- 阅读摘要