HDU 1166 敌兵布阵
2013-05-29 16:24
239 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
用结构体做的 470+ms;
用结构体做的 470+ms;
#include <cstdio> #include <algorithm> #include <iostream> #include <cstdlib> #include <queue> #include <cmath> #include <cstring> using namespace std; struct N { int z,y,data; struct N *l,*r; }; struct N *creat() { struct N *p = (struct N *)malloc(sizeof(struct N)); p->l = NULL; p->r = NULL; return p; } int st[50010]; int change(int z,int y,struct N *root) { int m = (z+y)/2; root->z = z; root->y = y; if(z == y) { root->data = st[z]; return (st[z]); } root->l = creat(); root->r = creat(); int tl = change(z,m,root->l); int tr = change(m+1,y,root->r); root->data = (tl + tr); return root->data; } void add(int site,int s,int z,int y,struct N *root) { int m = (z+y)/2; if(z == y) { root->data += s; return; } if(site <= m) { add(site,s,z,m,root->l); root->data += s; } else { add(site,s,m+1,y,root->r); root->data += s; } } void sub(int site,int s,int z,int y,struct N *root) { int m = (z+y)/2; if(z == y) { root->data -= s; return; } if(site <= m) { sub(site,s,z,m,root->l); root->data -= s; } else { sub(site,s,m+1,y,root->r); root->data -= s; } } int query(int ml,int mr,int z,int y,struct N *root) { int m = (z+y)/2; if(ml == z && mr == y) return root->data; if(mr <= m) { return query(ml,mr,z,m,root->l); } else if(m+1 <= ml) { return query(ml,mr,m+1,y,root->r); } else { return ( query(ml,m,z,m,root->l) + query(m+1,mr,m+1,y,root->r) ); } } int main() { int T; int icase = 0; int n,i; char order[20]; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i = 1;i <= n; i++) { scanf("%d",&st[i]); } struct N *root = creat(); root->z = 1; root->y = n; change(1,n,root); printf("Case %d:\n",++icase); while(scanf("%s",order) != EOF) { if(order[0] == 'E') break; else if(order[0] == 'A') { int site,s; scanf("%d %d",&site,&s); add(site,s,1,n,root); } else if(order[0] == 'S') { int site,s; scanf("%d %d",&site,&s); sub(site,s,1,n,root); } else if(order[0] == 'Q') { int l,r; scanf("%d %d",&l,&r); int sum = query(l,r,1,n,root); printf("%d\n",sum); } } } return 0; }
#include <cstdio>//用数组模拟的线段树 跑了370+ 玛德 说好的0ms呢 #include <algorithm>//在大白书 点修改 上看的 就是在不停的传递 树的节点编号node #include <iostream>//当前节点的左子节点编号为2*node 右子节点为2*node+1; #include <cstdlib> #include <queue> #include <cmath> #include <cstring> using namespace std; int st[100010]; int a[50001]; int change(int node,int l,int r) { int m = (l+r)/2; if(l == r) { st[node] = a[l]; return st[node]; } st[node] = change(node+node,l,m) + change(node+node+1,m+1,r); return st[node]; } void add(int site,int s,int node,int l,int r) { int m = (l+r)/2; if(l == r && r == site) { st[node] += s; return ; } if(site <= m) { add(site,s,node+node,l,m); st[node] += s; return ; } if(m < site) { add(site,s,node+node+1,m+1,r); st[node] += s; return ; } } void sub(int site,int s,int node,int l,int r) { int m = (l+r)/2; if(l == r && r == site) { st[node] -= s; return ; } if(site <= m) { sub(site,s,node+node,l,m); st[node] -= s; return ; } if(m < site) { sub(site,s,node+node+1,m+1,r); st[node] -= s; return ; } } int query(int ml,int mr,int node,int l,int r) { if(ml == l && mr == r) { return st[node]; } int m = (l+r)/2; if(mr <= m) { return query(ml,mr,node+node,l,m); } if(m < ml) { return query(ml,mr,node+node+1,m+1,r); } return (query(ml,m,node+node,l,m) + query(m+1,mr,node+node+1,m+1,r)); } int main() { int T,icase = 0; int n,i; char order[6]; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i = 1;i <= n; i++) scanf("%d",&a[i]); change(1,1,n); printf("Case %d:\n",++icase); while(scanf("%s",order) != EOF) { if(order[0] == 'A') { int site,s; scanf("%d %d",&site,&s); add(site,s,1,1,n); } else if(order[0] == 'S') { int site,s; scanf("%d %d",&site,&s); sub(site,s,1,1,n); } else if(order[0] == 'Q') { int l,r; scanf("%d %d",&l,&r); printf("%d\n",query(l,r,1,1,n)); } else if(order[0] == 'E') break; } } return 0; }
相关文章推荐
- hdu 1166 敌兵布阵(线段树)
- hdu1166 敌兵布阵 线段树
- hdu 1166 敌兵布阵 (线段树 单点更新 区间求和)
- HDU 1166 敌兵布阵(树状数组)
- hdu 1166 敌兵布阵 (树状数组)
- HDU 1166 敌兵布阵
- HDU-1166 敌兵布阵【简单线段树-单点更新+区间查询】
- hdu 1166 敌兵布阵--线段树
- HDU1166 敌兵布阵(树状数组)
- hdu-1166 敌兵布阵(树状数组水题)
- HDU 1166 敌兵布阵(线段树单点更新)
- HDU-1166-敌兵布阵
- HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
- 树状数组-HDU-1166-敌兵布阵
- HDU-1166 敌兵布阵 ( 线段树 )
- HDU 1166 敌兵布阵(树状数组)
- hdu1166 敌兵布阵(单点增减 & 区间求和)
- [线段树] HDU 1166 - 敌兵布阵
- HDU-1166- 敌兵布阵(线段树 插点问线)