/*
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
*/
hdu 4970 Killing Monsters 区间操作,O(n)简单法
最新推荐文章于 2019-01-25 14:54:40 发布