zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    url参数的获取
    ajax变量作用域的问题
    滚动条自适应宽度的问题
    js发送验证码(倒计时)
    字符串
    值类型和引用类型
    面向对象
    进程
    UI事件
    鼠标跟随
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11333985.html
Copyright © 2011-2022 走看看