题意:N个格子排成一条线,有M个炮塔,每个炮塔的覆盖范围为(L,R),伤害值为D,有Q个怪,每个怪都有一个HP和出现的位置S,怪从左往右走,问最后有几个怪能活下来.
思路:万恶的先入为主思想,一开始我就自以为很聪明地想用线段树,结果就T,常数太大.后来发现想复杂了,因为全市区间,所以只需要记录前一个格子的伤害值于后一个伤害值的关系,记录完之后从后往前推出每个格子的伤害就好,O(N)的复杂度就能模拟出来.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 100010
long long sum[maxn],h;
int main()
{
int cnt,l,r,d,s,n,m,q;
// freopen("data.in","r",stdin);
while(1){
scanf("%d",&n);
if(n==0) break;
memset(sum,0,sizeof(sum));
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d%d%d",&l,&r,&d);
sum[l-1]-=d;
sum[r]+=d;
}
for(int i=n-1;i>0;i--){
sum[i]+=sum[i+1];
}
for(int i=n-1;i>0;i--){
sum[i]+=sum[i+1];
}
cnt=0;
scanf("%d",&q);
for(int i=0;i<q;i++){
scanf("%I64d%d",&h,&s);
if(sum[s]<h) cnt++;
}
printf("%d\n",cnt);
}
}