HDU 1166 敌兵布阵
来源:互联网 发布:河南网络机柜生产厂家 编辑:程序博客网 时间:2024/06/05 04:04
看人家的AC代码真的好羡慕啊 我的就是不AC啊 要哭啦
</pre><pre code_snippet_id="1649084" snippet_file_name="blog_20160415_1_1692645" name="code" class="cpp">#include <iostream>#include<cstdio>#include<algorithm>const int N = 50000;struct mtree{ int l, r, sum;}tree[N*4+1];using namespace std;void build(int node, int b, int e){ tree[node].l = b; tree[node].r = e; if(b == e) { return; } int mid = (b+e)>>1; if(b<=mid) build(node<<1, b, mid); if(e>mid) build(node<<1|1, mid+1, e);}void update(int node, int b, int e, int add){ if(tree[node].l >= b && tree[node].r <= e) { tree[node].sum += add; return; } int mid = (tree[node].l + tree[node].r)>>1; if(b <= mid) update(node<<1, b, e, add); if(e > mid) update(node<<1|1, b, e, add); tree[node].sum = tree[node<<1].sum + tree[node<<1|1].sum;}int question2(int node, int b, int e){ if(tree[node].l >= b && tree[node].r <=e) { return tree[node].sum; } int x = 0; if(b<=tree[node<<1].r) x += question2(node<<1, b, e); if(e>=tree[node<<1|1].l) x += question2(node<<1|1, b, e); return x;}int main(){ int T; int w = 0; scanf("%d", & T); while(T--) { int m; int k; int l, r; char c[100]; printf("Case "); printf("%d", w+1); printf(":\n"); scanf("%d", &m); build(1,1,m); for(int i=1; i<=m; i++) { scanf("%d", &k); update(1, i, i, k); } while(scanf("%s", c)) { if(c[0] == 'E') break; else { scanf("%d%d", &l, &r); if(c[0] == 'Q') printf("%d\n", question2(1, l, r)); else if(c[0] == 'A') update(1, l, l, r); else if(c[0] == 'S') update(1, l, l, -r); } } } return 0;}/*1101 2 3 4 5 6 7 8 9 10Query 1 3Add 3 6Query 2 7Sub 10 2Add 6 3Query 3 10End*/
经过一番奋斗之后 我的代码终于AC啦
#include <iostream>#include<cstdio>#include<cstring>struct mtree{ int l, r, v, sum;}tree[200010];using namespace std;void build(int node, int b, int e){ tree[node].v = tree[node].sum = 0; tree[node].l = b; tree[node].r = e; int mid = (b+e)>>1; if(b == e) { return; } if(b<=mid) build(node<<1, b, mid); if(e>mid) build(node<<1|1, mid+1, e);}void update(int node, int b, int e, int add){ if(tree[node].l >=b && tree[node].r <=e) { tree[node].sum += add; tree[node].v += add; return; } int mid = (tree[node].l +tree[node].r)>>1; if(b<=mid) update(node<<1, b, e, add); if(e>mid) update(node<<1|1, b, e, add); tree[node].sum = tree[node<<1].sum + tree[node<<1|1].sum;}int query(int node, int b, int e){ if(tree[node].l >= b && tree[node].r <= e) { return tree[node].sum; } int x = 0; if(b<=tree[node<<1].r) x += query(node<<1, b, e); if(e>=tree[node<<1|1].l) x += query(node<<1|1, b, e); return x;}int main(){ int T; int l, r; int n; int k; int w = 0; char c[20]; scanf("%d", &T); while(T--) { scanf("%d", &n); build(1,1,n); for(int i=1; i<=n; i++) { scanf("%d", &k); update(1,i,i,k); } printf("Case %d:\n", ++w); while(scanf("%s", c) && strcmp(c,"End")!=0) { scanf("%d%d", &l, &r); if(strcmp(c,"Query") == 0) { printf("%d\n",query(1,l,r)); } else if(strcmp(c,"Add")==0) update(1,l,l,r); else if(strcmp(c, "Sub")==0) update(1,l,l,-r); } } return 0;}
可以借鉴的代码~~~~
#include<cstdio> #include<iostream> using namespace std; #define maxn 50000 struct mtree { int b,e;//b-e为区间 int sum; }tree[maxn*4]; void build(int node,int b,int e) { tree[node].b=b; tree[node].e=e; tree[node].sum=0; if(b==e) return; int mid=(b+e)/2; //左儿子 if(b<=mid) { build(node*2,b,mid); } //右儿子 if(mid<e) build(node*2+1,mid+1,e); } void update(int node,int n,int x) { if(tree[node].b==tree[node].e && tree[node].e ==n) { tree[node].sum+=x; return; } int mid=(tree[node].b+tree[node].e)/2; if(n<=mid) update(node*2,n,x);//往左查找 else update(node*2+1,n,x); tree[node].sum=tree[node*2].sum+tree[node*2+1].sum; } int query(int node,int b,int e) { int ans1=0,ans2=0; if(tree[node].b>=b&&tree[node].e<=e)//查询空间包括了树的区间才能取值 { return tree[node].sum; } int mid=(tree[node].b+tree[node].e)/2; if(b<=mid) ans1=query(node*2,b,e); if(mid<e) ans2=query(node*2+1,b,e); return ans1+ans2; } int main() { int t,i,j; scanf("%d",&t); for(j=1;j<=t;++j) { int n,a; char s[10]; int x,y; scanf("%d",&n); build(1,1,n);//建树 for(i=1;i<=n;++i) { scanf("%d",&a); update(1,i,a); } printf("Case %d:\n",j); while(scanf("%s",s)) { if(s[0]=='E') break; if(s[0]=='A') { scanf("%d%d",&x,&y); update(1,x,y); } if(s[0]=='S') { scanf("%d%d",&x,&y); update(1,x,-y); } if(s[0]=='Q') { scanf("%d%d",&x,&y); printf("%d\n",query(1,x,y)); } } } return 0; }
0 0
- HDU 1166 敌兵布阵
- HDU 1166 敌兵布阵
- hdu 1166 敌兵布阵
- hdu 1166 敌兵布阵
- HDU 1166 敌兵布阵
- hdu 1166 敌兵布阵
- hdu 1166 敌兵布阵
- hdu 1166敌兵布阵
- hdu 1166 敌兵布阵
- hdu 1166 敌兵布阵
- HDU 1166 敌兵布阵
- hdu 1166 敌兵布阵
- hdu 1166 敌兵布阵
- HDU 1166 敌兵布阵
- HDU 1166 - 敌兵布阵
- hdu 1166 敌兵布阵
- hdu 1166 敌兵布阵
- hdu 1166 敌兵布阵
- OLLYDBG快捷键和页面布局
- 数据库连接及操作
- 玩的开心
- JDK5新特性之增强for
- Skinned Mesh 原理解析和一个最简单的实现示例
- HDU 1166 敌兵布阵
- 剑指offer 面试题19:二叉树的镜像(leetcode226. Invert Binary Tree) 题解
- 过失集.2016.4.15
- 汉诺塔问题递归解法
- 网易游戏笔试题:编写string类的构造函数、拷贝构造函数、赋值构造函数和析构函数
- CSS3 @keyframes 规则
- Android(三)----数据存储和界面展现02
- Android:密码显示隐藏
- 序列化