HDU4970Killing Monsters

Posted lxyyyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU4970Killing Monsters相关的知识,希望对你有一定的参考价值。

HDU - 4970 Killing Monsters

先输入一个n表示一共有n个格子,然后输入k表示有k个攻击塔,紧跟k行数据,每行三个数字l,r,d,表示该攻击塔可以在l到r范围内造成d的伤害,然后输入一个m后面跟m行,每行两个数字h,x分别表示该怪物的血量和位置,怪物们将从他的位置x走到n,问能活着走到的有几只怪物。

dalao说这是一种懒操作 线性区间更新的懒操作 

将l~r的区间每个都加d 我们只想知道每个点的具体值 所以就不用树状数组、线段树什么的 只用将它a[l]+d,a[r+1]-d,从前往后扫一遍就能得到

先从前往后扫一遍得到每个点每次受到的攻击 再从后往前 得到从i走到n所受的总伤害

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
const int N=1e5+5,M=10000+5,inf=0x3f3f3f3f,P=9999973;
int n,m,k,ans;
ll a[N],hur[N],d,h;
template <class t>void rd(t &x)
    x=0;int w=0;char ch=0;
    while(!isdigit(ch)) w|=ch==-,ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=w?-x:x;


int main()
//    freopen("in.txt","r",stdin);
    while(scanf("%d",&n)==1&&n)
        memset(hur,0,sizeof(hur));
        memset(a,0,sizeof(a));
        ans=0;
        rd(m);
        for(int i=1,l,r;i<=m;++i)
            rd(l),rd(r),rd(d), 
            a[l]+=d,a[r+1]-=d;
        ll ret=0;
        for(int i=1;i<=n;++i) ret+=a[i],a[i]=ret;
        //从前往后 扫出在i点受到的伤害
        for(int i=n;i;--i) hur[i]=hur[i+1]+a[i];
        rd(k);
        for(int i=1,x;i<=k;++i)
            rd(h),rd(x);
            if(hur[x]<h) ++ans;
        
        printf("%d\\n",ans);
     
    return 0;

 

以上是关于HDU4970Killing Monsters的主要内容,如果未能解决你的问题,请参考以下文章

[Developing]HeadshotRecover Mut - 爆头回血插件 - Killing Floor 2

[Developed]InstantHealing Mut - 即刻回血插件 - Killing Floor 2

debian . linux问题Killing all remaining processes ... failed

adb server version (31) doesn't match this client (40); killing...的解决办法

Codeforces 1257D - Yet Another Monster Killing Problem

CF1257DYet Another Monster Killing Problem贪心