HDU 4970 Killing Monsters(树状数组)
Killing Monsters
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2838 Accepted Submission(s):
1068
build some towers to protect your kingdom from monsters. And now another wave of
monsters is coming and you need again to know whether you can get through
it.
The path of monsters is a straight line, and there are N blocks on it
(numbered from 1 to N continuously). Before enemies come, you have M towers
built. Each tower has an attack range [L, R], meaning that it can attack all
enemies in every block i, where L<=i<=R. Once a monster steps into block
i, every tower whose attack range include block i will attack the monster once
and only once. For example, a tower with attack range [1, 3] will attack a
monster three times if the monster is alive, one in block 1, another in block 2
and the last in block 3.
A witch helps your enemies and makes every
monster has its own place of appearance (the ith monster appears at block Xi).
All monsters go straightly to block N.
Now that you know each monster has
HP Hi and each tower has a value of attack Di, one attack will cause Di damage
(decrease HP by Di). If the HP of a monster is decreased to 0 or below 0, it
will die and disappear.
Your task is to calculate the number of monsters
surviving from your towers so as to make a plan B.
The
first line of each case is an integer N (0 < N <= 100000), the number of
blocks in the path. The second line is an integer M (0 < M <= 100000), the
number of towers you have. The next M lines each contain three numbers, Li, Ri,
Di (1 <= Li <= Ri <= N, 0 < Di <= 1000), indicating the attack
range [L, R] and the value of attack D of the ith tower. The next line is an
integer K (0 < K <= 100000), the number of coming monsters. The following
K lines each contain two integers Hi and Xi (0 < Hi <= 10^18, 1 <= Xi
<= N) indicating the ith monster’s live point and the number of the block
where the ith monster appears.
The input is terminated by N = 0.
monsters.
2
1 3 1
5 5 2
5
1 3
3 1
5 2
7 3
9 1
0
In the sample, three monsters with origin HP 5, 7 and 9 will survive.
#include <cstdio>
#include <cstring>
#include <iostream>
#define lowbit(x) (x&(-x)) using namespace std; int n, m, k, l, r, d, x, ans;
long long sum[], a[], h; void update(int i, int v)
{
while (i <= n)
{
a[i] += v;
i += lowbit(i);
}
} long long get_sum(int i) //求的是该点的和
{
long long all = ;
while (i>)
{
all += a[i];
i -= lowbit(i);
}
return all;
} int main()
{
while (scanf("%d", &n), n != )
{
scanf("%d", &m);
memset(a, , sizeof(a));
while (m-->)
{
scanf("%d%d%d", &l, &r, &d);
update(l, d);//类似气球贴标签,这样求前缀和就是该数对应块上的炮弹叠加和
update(r + , -d);
}
sum[n + ] = ;
for (int i = n; i>; --i)
{
sum[i] = sum[i + ] + get_sum(i); }
/*for (int i = 1; i <= n; i++)
cout << get_sum(i) << endl;*/
scanf("%d", &k);
ans = ;
while (k-->)
{
scanf("%I64d%d", &h, &x);
if (h>sum[x])
++ans;
}
printf("%d\n", ans);
}
return ;
}
巧妙的数组(类似贴气球)
解题思路:对于攻击台,l,r,val,在v[l]处加上val,v[r+1]处减掉val。然后遍历一遍v数组递推出各个点的伤害。并且处理处伤害的前缀和。然后对于每只怪物去判断。
做完后查看题解,发现本题查询时很有规律,所以不必使用树状数组,读入数据时,对damage数组进行如下操作:damage[L]+=d,damage[R+1]-=d,表示区间[L,R]内点每个点都会加上d,最后正着扫一边,即可得到i点能造成点伤害damage[i],再倒着扫一边,即可得到区间[i,n]能造成点伤害总和damage[i]
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn = 1e5 + ;
typedef unsigned long long ll; int N, M;
ll v[maxn]; void init()
{
int l, r, val; scanf("%d", &M);
memset(v, , sizeof(v));
for (int i = ; i < M; i++)
{
scanf("%d%d%d", &l, &r, &val);
v[l] += val;
v[r + ] -= val;
} ll mv = ;
for (int i = ; i <= N; i++)
{
mv += v[i];
v[i] = mv;
} for (int i = ; i <= N; i++)
v[i] += v[i - ];
} int main()
{ while (scanf("%d", &N) == && N)
{
init(); scanf("%d", &M); int pos, ret = ;
ll HP;
for (int i = ; i < M; i++)
{
scanf("%I64d%d", &HP, &pos);
if (HP > v[N] - v[pos - ])
ret++;
}
printf("%d\n", ret);
}
return ;
}
HDU 4970 Killing Monsters(树状数组)的更多相关文章
- hdu 4970 Killing Monsters(数组的巧妙运用) 2014多校训练第9场
pid=4970">Killing Monsters ...
- HDU 3333 | Codeforces 703D 树状数组、离散化
HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...
- HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)
题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...
- HDU 3333 Turing Tree (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. //#pragma comment(l ...
- HDU 4325 Flowers(树状数组+离散化)
http://acm.hdu.edu.cn/showproblem.php?pid=4325 题意:给出n个区间和m个询问,每个询问为一个x,问有多少个区间包含了x. 思路: 因为数据量比较多,所以需 ...
- hdu 5775 Bubble Sort 树状数组
Bubble Sort 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 Description P is a permutation of t ...
- HDU - 1541 Stars 【树状数组】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意 求每个等级的星星有多少个 当前这个星星的左下角 有多少个 星星 它的等级就是多少 和它同一 ...
- HDU 3854 Glorious Array(树状数组)
题意:给一些结点,每个结点是黑色或白色,并有一个权值.定义两个结点之间的距离为两个结点之间结点的最小权值当两个结点异色时,否则距离为无穷大.给出两种操作,一种是将某个结点改变颜色,另一个操作是询问当前 ...
- HDU 3874 Necklace (树状数组 | 线段树 的离线处理)
Necklace Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
随机推荐
- js 多个倒计时,毫秒倒计时
其实主要是借鉴了了这篇文的写法(http://tuzwu.iteye.com/blog/819081),俺稍作了修改,以便更适合我的需要: 实现功能:调用一个函数,传入html元素的id,和一个截止时 ...
- MP3格式音频文件结构解析
MP3的全称是MPEG Audio Layer3,它是一种高效的计算机音频编码方案,它以较大的压缩比将音频文件转换成较小的扩展名为.MP3的文件,基本保持原文件的音质.MP3是ISO/MPEG标准的一 ...
- 《gradle 用户指南中文版》 第1章、简介
第1章.简介 目录 1.1 关于本用户指南 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具. 这里我们将介绍Gradle,我们认为gradle让java项 ...
- Objective C - 2 - 随机数,可变字符串,字符串,SubString
int main(int argc, const char * argv[]) { @autoreleasepool { NSString *outputString = @"1234567 ...
- Android学习问题记录之java.lang.UnsatisfiedLinkError
1.问题描述 Android Studio引入第三方类库时,出现错误java.lang.UnsatisfiedLinkError: 11-09 14:58:05.500 13280-13280/cn. ...
- Java Web 减少网络 IO、静态资源磁盘 IO 有效的办法--响应使用 GZIP( 压缩http请求与响应gzip压缩)
(转载http://blog.csdn.net/hylclxy/article/details/7779662) 出于节约流量考虑, 客户端在向服务端发送request的时候对post数据进行gzip ...
- 折腾 Phalcon 的笔记
不要用 IIS!Apache 万岁! 不要用 Web Platform Installer!自己动手丰衣足食! 注意版本号.TS 与 NonTS.x86 与 x64 的区别! 关于 Apache 的配 ...
- BZOJ4566 Haoi2016 找相同字符【广义后缀自动机】
Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别 ...
- BZOJ4292 PA2015 Równanie 【暴力水题】
BZOJ4292 PA2015 Równanie Description 对于一个正整数n,定义f(n)为它十进制下每一位数字的平方的和.现在给定三个正整数k,a,b,请求出满足a<=n< ...
- 20179223《Linux内核原理与分析》第三周学习笔记
测试3的实验: 1. 用gcc -g编译vi输入的代码 2. 在main函数中设置一个行断点 3. 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点 4. 提交调 ...