首页 > 代码库 > HDU4970-Killing Monsters

HDU4970-Killing Monsters

题目链接


题意:塔防游戏,长为n的一条路上建造m个箭塔,每个箭塔攻击范围为[l, r],每格造成伤害为d,再给出k只怪兽的血量h,出现位置x,怪兽向前走,问最后还有几只怪兽存活。

思路:先求出每个格子造成的伤害,开一个stack数组,stack[l] += d,stack[r + 1] -= d,然后从前往后扫描一次,这样就可以得到每个格子造成的伤害;然后求出第1格到第i格造成的伤害,做法同上,之后就可以判断哪些怪兽是活着的了。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef __int64 ll;

const int MAXN = 100005;

ll sum[MAXN], stack[MAXN], hurt[MAXN];
int L[MAXN], R[MAXN], d[MAXN];
int n;

int main() {
    while (scanf("%d", &n) && n) {
        memset(stack, 0, sizeof(stack));
        memset(sum, 0, sizeof(sum));
        memset(hurt, 0, sizeof(hurt));
        int a;
        scanf("%d", &a);
        for (int i = 1; i <= a; i++) {
            scanf("%d%d%d", &L[i], &R[i], &d[i]);
            stack[L[i]] += d[i];
            stack[R[i] + 1] -= d[i];
        }

        for (int i = 1; i <= n; i++) {
            sum[i] = sum[i - 1] + stack[i];  
        }//每格的伤害
        for (int i = 1; i <= n; i++) {
            hurt[i] = hurt[i - 1] + sum[i]; 
        }//从第1格到第i格的伤害

        ll h; 
        int ans = 0, x, b;
        scanf("%d", &b);
        for (int i = 0; i < b; i++) {
            scanf("%I64d%d", &h, &x);
            if (hurt[n] - hurt[x - 1] < h) 
                ans++;
        } 
        printf("%d\n", ans);
    }   
    return 0;
}