hdu 4970 Killing Monster

题目链接:点击打开链接


本题对于某区间的总伤害可以用一个类似求前缀和的方法做。

1.对一个区间l,r加上伤害d: 令sum[l]+=d,sum[r+1]-=d。

2.用for(int i=2;i<=n;i++){
                sum[i]+=sum[i-1];
        }

    得到每一点所受的伤害。

3.用for(int i=n-1;i>=1;i--){
                sum[i]+=sum[i+1];


        }

    得到从第一点到这一点所受的伤害。


本题输入量巨大,加入了输入挂。


开始用线段树写的,加了输入挂也没过。。。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;

ll sum[100010];
void input2(long long &n){
    long long res=0;
    bool flag=0;
    char ch;
    ch=getchar();
    while(ch!=EOF&&(ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if(ch=='-') flag=1;
    while(ch>='0'&&ch<='9'){
            res=res*10+ch-'0';
            ch=getchar();
    }
    n=(flag?-res:res);
}
void input(int &n){
    int res=0;
    bool flag=0;
    char ch;
    ch=getchar();
    while(ch!=EOF&&(ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if(ch=='-') flag=1;
    while(ch>='0'&&ch<='9'){
            res=res*10+ch-'0';
            ch=getchar();
    }
    n=(flag?-res:res);
}
int main(){
    int n;
    while(input(n),n){
        memset(sum,0,sizeof(sum));
        int M;
        input(M);
        for(int i=1;i<=M;i++){
            int l,r,d;
            input(l);
            input(r);
            input(d);
            sum[l]+=d;
            sum[r+1]-=d;
        }
        for(int i=2;i<=n;i++){
                sum[i]+=sum[i-1];
        }
        for(int i=n-1;i>=1;i--){
                sum[i]+=sum[i+1];

        }
        int K;
        input(K);
        int res=0;
        for(int i=1;i<=K;i++){
                ll h;
                int p;
                input2(h);
                input(p);
                if(sum[p]<h) res++;
        }
        printf("%d\n",res);
    }
    return 0;
}


你可能感兴趣的:(hdu 4970 Killing Monster)