HDU 1166 敌兵布阵 (树状数组和线段树解法)
2015-06-04 10:51
399 查看
题目: 戳我
树状数组code:
线段树code:
线段树代码太长===
树状数组code:
#include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> using namespace std; #define clc(a, b) memset(a, b, sizeof(a)) const int inf = 0x3f; const int INF = 0x3f3f3f3f; const int maxn = 5e4+5; int c[maxn], n; int lowbit(int x) { return x&-x; } void add(int x, int val) { while(x<=n) { c[x] += val; x += lowbit(x); } } int query(int l, int r) { int sum1 = 0, sum2 = 0; while(r > 0) { sum1 += c[r]; r -= lowbit(r); } l = l-1; while(l > 0) { sum2 += c[l]; l -= lowbit(l); } return sum1-sum2; } int main() { int T, x, l, r; char q[100]; scanf("%d", &T); for(int t = 1; t <= T; t++) { scanf("%d", &n); clc(c, 0); for(int i = 0; i < n; i++) { scanf("%d", &x); add(i+1, x); } printf("Case %d:\n", t); while(true) { scanf(" %s", q); if(!strcmp(q, "End")) break; if(!strcmp(q, "Query")) { scanf("%d %d", &l, &r); printf("%d\n", query(l, r)); } else if(!strcmp(q, "Sub")) { scanf("%d %d", &l, &x); add(l, -x); } else { scanf("%d %d", &l, &x); add(l, x); } } } return 0; }
线段树code:
线段树代码太长===
#include <stdio.h> #include <string.h> int a[50010]; struct node { int left,right,sum; }b[150010]; void build(int left,int right,int i) { int mid; b[i].left=left; b[i].right=right; if(left==right) { b[i].sum = a[left]; return ; } mid=(left+right)/2; build(left,mid,2*i); build(mid+1,right,2*i+1); b[i].sum=b[2*i].sum+b[2*i+1].sum; } void Add(int id,int num,int i) { if(b[i].left==b[i].right) { b[i].sum=b[i].sum+num; return ; } else { b[i].sum=b[i].sum+num; if(id<=b[i*2].right) Add(id,num,2*i); else Add(id,num,2*i+1); } } int Query(int left, int right,int i) { int mid; if(b[i].left==left && b[i].right ==right) return b[i].sum; mid=(b[i].left+b[i].right)/2; if(right<=mid) return Query(left,right,2*i); else if (left>mid ) return Query(left,right,2*i+1); else return Query(left,mid,2*i) + Query(mid+1,right,2*i+1); } int main() { int Case; int n; char str[10]; scanf("%d",&Case); int id,num; int i; int k=1; while(Case--) { scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a[i]); } build(1,n,1); printf("Case %d:\n",k++); while(1) { scanf("%s",str); if(strcmp(str,"End")==0) break; scanf("%d%d",&id,&num); if(strcmp(str,"Query")==0) { printf("%d\n",Query(id,num,1)); } if(strcmp(str,"Add")==0) { //scanf("%d%d",&id,&num); Add(id,num,1); } if(strcmp(str,"Sub")==0) { //scanf("%d%d",&id,&num); Add(id,-num,1); } } } return 0; }
相关文章推荐
- C/C++内存管理详解 ZZ
- PhoneGap安装手顺
- Oracle 查看表空间的大小及使用情况sql语句
- STL 的一些数据结构比较
- VPS主机
- 《gre阅读39+3全攻略》下载
- 怎么解决ie的圆角问题
- 学习笔记 - 批处理2
- 二叉树的遍历(4):层次遍历
- pidstat详解
- POJ 2031 Building a Space Station (最小生成树)
- 相关题目
- Binary Tree Level Order Traversal II
- 编译时所需的文件(包含头文件和库文件)使用方法
- swift基础语法之控件使用02
- onDraw dispatchDraw
- 如何避免IE浏览器自动升级到版本11
- C#实现窗口之间的传值
- js便利对象属性
- 谷歌扩展包使用教程