【HDU4970】Killing 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
",ans);
    } 
    return 0;
}
原文地址:https://www.cnblogs.com/lxyyyy/p/11333985.html