hdu 4970 Killing Monsters 多校九 求和

来源:互联网 发布:简单好学的软件 编辑:程序博客网 时间:2024/06/03 09:24

题目链接:hdu 4970

        给定一条长为n的路,给你m个防御塔,每个防御塔会对l到r范围的怪物,每格造成一次d的伤害,然后给你k只怪物,给出它们的hp与出生位置,问最终能有几只怪物活着走完全程。

        简单题,只要求出每一点开始到结束点的伤害总和与怪物的hp对比即可求得解

        这里的考点是怎么快速求和,给定的是段块上的定值,如果对每一段中每一小格累加,妥妥的TLE。

        于是求和可以这样操作,对每一段l~r的d值,我们在l位置记录一个增加d的值,在r+1位置减去d的值,然后从前向后扫一遍,根据i位置的增减情况,快速求得该位置的最终值,累加起来即可

/****************************************************** * File Name:   1011.cpp * Author:      kojimai * Creater Time:2014年08月19日 星期二 12时00分54秒******************************************************/#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>using namespace std;#define FFF 100005long long att[FFF],c[FFF];void out(){for(int i=1;i<=5;i++){cout<<i<<' '<<att[i]<<endl;}return;}int main(){int n;while(~scanf("%d",&n),n){memset(c,0,sizeof(c));att[0]=0;int tow,mon;scanf("%d",&tow);int l,r,d;for(int i=0;i<tow;i++){scanf("%d%d%d",&l,&r,&d);c[l]+=d;c[r+1]-=d;}long long tmp=0;for(int i=1;i<=n;i++){tmp+=c[i];att[i]=att[i-1]+tmp;}//out();long long h;int xi;scanf("%d",&mon);int cnt=0;for(int i=0;i<mon;i++){scanf("%I64d%d",&h,&xi);if(att[n]-att[xi-1]<=h)cnt++;}cout<<cnt<<endl;}        return 0;}


0 0
原创粉丝点击