hud 4970 Killing Monsters 模拟

题意:N个格子排成一条线,有M个炮塔,每个炮塔的覆盖范围为(L,R),伤害值为D,有Q个怪,每个怪都有一个HP和出现的位置S,怪从左往右走,问最后有几个怪能活下来.

思路:万恶的先入为主思想,一开始我就自以为很聪明地想用线段树,结果就T,常数太大.后来发现想复杂了,因为全市区间,所以只需要记录前一个格子的伤害值于后一个伤害值的关系,记录完之后从后往前推出每个格子的伤害就好,O(N)的复杂度就能模拟出来.


#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 100010
long long sum[maxn],h;
int main()
{
        int cnt,l,r,d,s,n,m,q;
       // freopen("data.in","r",stdin);
        while(1){
                scanf("%d",&n);
                if(n==0) break;
                memset(sum,0,sizeof(sum));
                scanf("%d",&m);
                for(int i=0;i<m;i++){
                        scanf("%d%d%d",&l,&r,&d);
                        sum[l-1]-=d;
                        sum[r]+=d;
                }
                for(int i=n-1;i>0;i--){
                        sum[i]+=sum[i+1];
                }
                for(int i=n-1;i>0;i--){
                        sum[i]+=sum[i+1];
                }
                cnt=0;
                scanf("%d",&q);
                for(int i=0;i<q;i++){
                        scanf("%I64d%d",&h,&s);
                        if(sum[s]<h) cnt++;
                }
                printf("%d\n",cnt);
        }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值