【HDU1166】敌兵布阵(树状数组或线段树)
是一道树状数组的裸题,也可以说是线段树的对于单点维护的裸题。多做这种题目可以提高自己对基础知识的理解程度,很经典。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <numeric>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <string>
using namespace std; const int N = ;
int C[N]; struct peo {
int x, v;
}P[N]; int lowbit (int x) {
return x & -x;
} int sum (int x) {
int ret = ;
while (x > ) {
ret += C[x]; x -= lowbit(x);
}
return ret;
} void add (int x, int d) {
while (x <= ) {
C[x] += d; x += lowbit(x);
}
} int _sum (int d, int u) {
return sum(u) - sum(d - );
} int main () {
int T, n, cur = ; scanf("%d", &T);
char op[];
while (T --) {
memset(C, , sizeof(C));
memset(P, , sizeof(P));
scanf("%d", &n);
for (int i = ; i < n; ++ i) {
scanf("%d", &P[i].v);
P[i].x = i + ;
add (P[i].x, P[i].v);
}
//cout << sum(3) << endl;
printf("Case %d:\n", ++ cur);
while (scanf("%s", op)) {
if (op[] == 'E') {
break;
} else if (op[] == 'Q') {
int x, y;
scanf("%d %d", &x, &y);
cout << _sum(x, y) << endl;
} else if (op[] == 'S') {
int x, y;
scanf("%d %d", &x, &y);
add (x, -y);
} else if (op[] == 'A') {
int x, y;
scanf("%d %d", &x, &y);
add (x, y);
}
}
}
return ;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <algorithm>
#include <numeric> using namespace std; struct P{
int sum, l, r;
} node[]; int n, num[] = {}; void build (int k, int l, int r) {
node[k].l = l, node[k].r = r;
if (l == r) {
node[k].sum = num[l];
} else {
build( * k, l, (l + r) / );
build( * k + , ((l + r) / ) + , r);
node[k].sum = node[ * k].sum + node[ * k + ].sum;
}
} void update(int k, int i, int x) {
if (node[k].l <= i && node[k].r >= i) {
node[k].sum += x;
}
if (node[k].l == node[k].r) {
return ;
}
if (i <= node[ * k].r) {
update( * k, i, x);
}
else update( * k + , i, x);
} int query (int k, int l, int r) {
if (l == node[k].l && r == node[k].r) {
return node[k].sum;
}
if (r <= node[ * k].r) {
return query( * k, l, r);
}
if (l >= node[ * k + ].l) {
return query( * k + , l, r);
} else {
return query( * k, l, node[ * k].r) + query( * k + , node[ * k + ].l, r);
}
} int main(){
int T;
scanf("%d",&T);
for (int z = ; z <= T; ++ z) {
memset(num, , sizeof(num));
scanf("%d", &n);
for (int i = ; i <= n; ++ i) {
scanf("%d",&num[i]);
}
build(, , n);
char s[];
printf("Case %d:\n",z);
while (scanf("%s", s)){
if (s[] == 'E') break;
if (s[] == 'Q'){
int a, b;
scanf("%d%d" ,&a ,&b);
printf("%d\n",query(, a, b));
}
if (s[] == 'A'){
int a,x;
scanf("%d%d", &a, &x);
update(, a, x);
}
if (s[] == 'S') {
int a,x;
scanf("%d%d", &a, &x);
update(, a, -x);
}
}
}
return ;
}
【HDU1166】敌兵布阵(树状数组或线段树)的更多相关文章
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- POJ 1195 Mobile phones (二维树状数组或线段树)
偶然发现这题还没A掉............速速解决了............. 树状数组和线段树比较下,线段树是在是太冗余了,以后能用树状数组还是尽量用......... #include < ...
- 【BZOJ3196】二逼平衡树(树状数组,线段树)
[BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
- P3157 [CQOI2011]动态逆序对(树状数组套线段树)
P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...
- HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)
Jam's problem again Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树
题意概述:带修改求区间第k大. 分析: 我们知道不带修改的时候直接上主席树就可以了对吧?两个版本号里面的节点一起走在线段树上二分,复杂度是O((N+M)logN). 然而这里可以修改,主席树显然是凉了 ...
- HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Tota ...
随机推荐
- poj 3666 Making the Grade(dp)
Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...
- java多个listener监听
java 多个listener 监听方法 在class 名称上一行添加@Listeners 括号中用逗号隔开 @Listeners({com.example.MyListener.class,com. ...
- (转)iOS7界面设计规范(10) - UI基础 - 文字排版与配色
明天就是周四了.貌似前几天还在恨周一呢.话说今天几乎开了一整天的会,正经事情没做多少:这种感觉比一整天从早到晚12个小时的忙碌于一件事情还要让人感到疲惫的对叭?那今天的iOS7设计规范更新又是一篇很简 ...
- ffmpeg + sdl -03 简单音频播放器实现
没办法,工作中遇到了问题. 目前NEC EMMA的架构如下: 从USB读入文件 -> 文件分析并提取Packet中的Payload Data -> NEC HANDLE AVTrans ...
- SRM 588 D2 L3:GameInDarknessDiv2,DFS
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12710 采用DFS搜索,第一次写的时候忘了加访问标志,结果状态 ...
- cocos2d-x 3.6版连连看
写个连连看来讲游戏开发,我认为实例解说效果会好一些. 终端以下cd到源代码文件夹,敲命令: cocos new LLK -p com.goonear.llk -l cpp -d ./Goonear 脚 ...
- 【转】Xcode升到6.4插件失效,与添加插件不小心点击Skip Bundle解决办法
转载自:http://www.jianshu.com/p/d51547d29309 今天升级了xcode到6.4 发现之前装的插件不能使用了.这里有一个解决的方案: 步骤如下: 一.查看Xcode的U ...
- (转)Javascript 面向对象编程(一):封装(作者:阮一峰)
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果 ...
- RadGrid SelectedIndexChanged 事件没反应的解决方法
Hello Hrushikesh, You can set ClientSettings.EnablePostBackOnRowClick to true along with ClientSetti ...
- Mysql学习(慕课学习笔记6)修改数据表(上)
添加单列 Alter table tb1_name ADD[column] col_name column_definition [first | after col_name] 列名称 ...