hdu 4970 Killing Monsters 区间操作,O(n)简单法

/*
ID: neverchanje
PROG:
LANG: C++11
*/
#include<vector>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define INF 1e9
#define maxn 100010
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define mset(x) memset(x,0,sizeof(x))
typedef __int64 ll;
typedef pair<int,int> pii;
typedef vector<int> vi;

int  n, m, k, L, R;
ll D, H, X;
ll block[maxn], sum[maxn];
int main(){
//	freopen("a.txt","r",stdin);
//	freopen(".out","w",stdout);
	while(~scanf("%d",&n) && n){
		mset(block);
		mset(sum);
		scanf("%d",&m);
		rep(i,1,m){
			scanf("%d%d%I64d", &L, &R, &D);
			block[L]+=D;
			block[R+1]-=D;
		}
		rep(i,1,n)
			block[i] += block[i-1];
		
		for(int i=n;i>0;i--)
			sum[i] = sum[i+1] + block[i];

		int ans=0;
		scanf("%d",&k);
		rep(i,1,k){
			scanf("%I64d%d", &H, &X);
			if(sum[X]<H)
				ans++;
		}
		printf("%d\n",ans);
	}
	return 0;
}

/*
DESCRIPTION: 
一开始还以为一个塔只能打一片区域的其中一个格子,原来是打区域炮
其实就是要预处理出block[i]到block[n]的总和,初始值是0

如果能将所有塔的攻击叠加起来,得到每一个block[i]所受到的攻击值
那么就能用O(n)求出block[i]到block[n]的总和: sum[i] = sum[i+1]+block[i]

可以让block[L]=D, block[R+1]=-D,这样扫过去的时候,使得L到R上每一个block都+D,而后面的格子不会+D

hdu真的只能用I64d 和 __int64....,注意输入不能用cin
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值