1 条题解
-
1
这波贪了……
思路
目测可知,怪兽只会被在他右边的炸弹炸死,而且是最远的位置,因为如果在别的位置要么炸不到,要么炸到的别的怪兽的数量变少。就拿样例二举例,怪兽只会被在位置的炸弹炸死,因为这样一颗炸弹可以炸到所有怪兽。
那当我们把第一个怪兽炸死了,第二个怪兽就成为了原本第一个怪兽,不断以此类推即可。
对于一颗炸弹对于其他怪兽的影响,我们只需用upper_bound找到最远会炸到那个怪兽,用差分数组维护每个怪兽被之前的炸弹炸掉的血量即可。
AC代码
#include<bits/stdc++.h> #define int long long using namespace std; const int N=2e5+10; struct node{int x,h;}a[N]; bool operator<(node n1,node n2){return n1.x<n2.x;} int n,r,d,dd[N]; signed main() { scanf("%lld%lld%lld",&n,&r,&d); for(int i=1;i<=n;i++)scanf("%lld%lld",&a[i].x,&a[i].h); sort(a+1,a+n+1); int cnt=0; for(int i=1,dam=0;i<=n;i++) { dam+=dd[i]; a[i].h-=dam; if(a[i].h>0) { int id=upper_bound(a+1,a+n+1,node{a[i].x+r*2,0})-a; dam+=(a[i].h+d-1)/d*d; dd[id]-=(a[i].h+d-1)/d*d; cnt+=(a[i].h+d-1)/d; } } printf("%lld\n",cnt); return 0; }
- 1
信息
- ID
- 11818
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 2
- 上传者