首页 > 其他分享 >[题解]AT_abc153_f [ABC153F] Silver Fox vs Monster

[题解]AT_abc153_f [ABC153F] Silver Fox vs Monster

时间:2023-10-14 19:47:54浏览次数:34  
标签:ABC153F Monster abc153 int 题解 炸弹 区间 sim

模拟赛最后 \(15\) 分钟想到的做法。

思路

首先有一个显然的贪心策略:我们放炸弹的地方要尽可能的使这个炸弹能影响到更多的怪上。

那么我们可以将对于一个怪 \(i\) 能够影响到它的区间表示出来 \([\max(1,l_i - d),a_i + r]\)。

然后将这些区间排个序,可以粗略画出这样的图:

根据上文提到的贪心策略,发现在红线处放炸弹最优。大胆猜测如果对于当前枚举到的怪还需要用炸弹,一定用在能够影响它的区间的右端点。

不难发现这样做是正确的,因为当你处理 \(i\) 时,\(1 \sim (i - 1)\) 都已经处理完毕,而你已经对区间排序了,所以 \(i \sim n\) 的区间一定在 \(i\) 之后,放在右端点一定最优。

那么,如何处理 \(i\) 还需要用几个炸弹。

首先刚开始时,显然要用 \(\lceil \frac{h_i}{a} \rceil\) 个。

在处理了 \(1 \sim (i - 1)\) 之后,\(i\) 还需要用 \(\max(0,\lceil \frac{h_i}{a} \rceil - \Delta)\) 个炸弹,其中 \(\Delta\) 表示在处理 \(1 \sim (i - 1)\) 时,在能影响当前怪的区间中的炸弹数量。

发现单点修改,区间查询,直接用树状数组维护即可。因为 \(x_i\) 较大,需要离散化。

code

#include <bits/stdc++.h>
#define re register
#define int long long

using namespace std;

const int N = 4e5 + 10;
int n,d,k,m,idx,ans;
vector<int> p;
unordered_map<int,int> mp;

struct point{
	int x;
	int num;
	
	friend bool operator <(const point &a,const point &b){
		return a.x < b.x;
	}
}arr[N];

struct sec{
	int l;
	int r;
	int num;
	
	friend bool operator <(const sec &a,const sec &b){
		if (a.l != b.l) return a.l < b.l;
		return a.r < b.r;
	}
}s[N];

inline int read(){
	int r = 0,w = 1;
	char c = getchar();
	while (c < '0' || c > '9'){
		if (c == '-') w = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9'){
		r = (r << 3) + (r << 1) + (c ^ 48);
		c = getchar();
	}
	return r * w;
}

inline int up(int a,int b){
	if (a % b == 0) return a / b;
	return a / b + 1;
}

struct BIT{
	int tr[N];
	
	inline int lowbit(int x){
		return x & -x;
	}
	
	inline void modify(int x,int k){
		if (!x) return;
		for (re int i = x;i <= m;i += lowbit(i)) tr[i] += k;
	}
	
	inline int query(int x){
		int res = 0;
		for (re int i = x;i;i -= lowbit(i)) res += tr[i];
		return res;
	}
}tree;

signed main(){
	n = read();
	d = read();
	k = read();
	for (re int i = 1;i <= n;i++){
		int h;
		arr[i].x = read();
		h = read();
		arr[i].num = up(h,k);
	}
	sort(arr + 1,arr + n + 1);
	for (re int i = 1;i <= n;i++){
		p.push_back(max(1ll,arr[i].x - d));
		p.push_back(arr[i].x + d);
		s[i] = {max(1ll,arr[i].x - d),arr[i].x + d,arr[i].num};
	}
	sort(p.begin(),p.end());
	unique(p.begin(),p.end());
	for (auto x:p) mp[x] = ++idx;
	for (re int i = 1;i <= n;i++){
		s[i] = {mp[s[i].l],mp[s[i].r],s[i].num};
		m = max(m,s[i].r);
	}
	sort(s + 1,s + n + 1);
	for (re int i = 1;i <= n;i++){
		int cnt = s[i].num - tree.query(s[i].r) + tree.query(s[i].l - 1);
		if (cnt <= 0) continue;
		ans += cnt;
		tree.modify(s[i].r,cnt);
	}
	printf("%lld",ans);
	return 0;
}

标签:ABC153F,Monster,abc153,int,题解,炸弹,区间,sim
From: https://www.cnblogs.com/WaterSun/p/AT_abc153_f.html

相关文章

  • P1084疫情控制 题解
    P1084疫情控制前言:这题思路不难,实现稍微有点难。总体来说,不算特别难的那种紫题,建议评蓝。题目描述给定一些点,用这些点来切断根节点到所有叶子节点的路径,可以移动这些点,不同的点可以同时移动,求时间最少。思考过程不同的点可以同时移动:看到这里,我们可以转化一下题目:给定......
  • [AGC033C] Removing Coins题解
    思路可以看出,每次对一个点\(u\)操作一次,就相当于删除以\(u\)为根的所有叶节点。当然我们还是没有什么思路,我们可以想简单一点:在一条链上的情况。如果\(u\)是链的端点:以\(u\)为根节点的叶节点只有一个,所以链的长度减一。如果\(u\)不是链的端点:以\(u\)为根节点......
  • P1612 [yLOI2018] 树上的链 题解
    思路看到条件\(2\),我们得知:这个节点对应的最长链,一定在这个节点到根节点的简单路径上。所以我们记录\(1\)到\(i\)之间的权值和,记为\(sum_i\)。因为权值是正整数,所以满足单调性,可以二分。如何二分路径上的点呢?我们维护一个与当前dfs同步的栈,记录从根节点到当前节点的简......
  • [ARC116C] Multiple Sequences题解
    思路我们可以很好的想到一种\(O(nm)\)的dp:状态:\(dp_{i,j}\)为搜到第\(i\)个,最后一个数是\(j\)的方案数。转移:\(dp_{i,j}=\displaystyle\sum_{k|j,k\not=j}dp_{i-1,k}\)当然这是会超时的。我们换一种思路,我们先枚举最后一个数,再计算方案数。这有个好处,我们缩小......
  • 苏格拉底问答、实践过程截图、遇到问题解决问题截图,代码链接
    defineVOLUME_NAME"EXT2FS"//卷名#defineBLOCK_SIZE512//块大小#defineDISK_SIZE4612//磁盘总块数defineDISK_START0//磁盘开始地址#defineSB_SIZE32//超级块大小是32BdefineGD_SIZE32//块组描述符大小是32B#defineGDT_START(0+512)//块组描述......
  • Android项目在 app 中通过 WebView 访问 url显示空白,使用浏览器可以打开,Android WebVi
    这是服务器证书校验WebView的安全问题服务器证书校验主要针对WebView的安全问题。在app中需要通过WebView访问url,因为服务器采用的自签名证书,而不是ca认证,使用WebView加载url的时候会显示为空白,出现无法加载网页的情况。使用ca认证的证书,在WebView则可以直接......
  • 网络规划设计师真题解析--PERT “计划评审技术”(三点估算法)
    某网络建设项目的安装阶段分为A、B、C、D四个活动任务,各任务顺次进行,无时间上重叠,各任务完成时间估计如下图所示,按照计划评审技术,安装阶段工期估算为(70)天。(2019年)(70)A.31   B.51    C.53    D.83答案:C解析:依据三点估算公示,活动历时均值=(最悲观时间+最可能时间*4+......
  • 算法题解——多数元素
    题目给定一个大小为n的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数大于⌊n/2⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例1:输入:nums=[3,2,3]输出:3示例2:输入:nums=[2,2,1,1,1,2,2]输出:2提示:n==nums.length......
  • [AGC009B] Tournament 题解
    思路考虑树形\(\text{dp}\)。我们将每个人与把自己淘汰的人连边。得到一颗以一为根的树。由于我们需要求出必须赢的场数最多的那位选手,至少要赢多少场。考虑最多的限制。可以使用树型动态规划。每一次两个人比赛的代价为:\[dp_i=\max(dp_i,dp_j)+1\]这样就达成了最多的限......
  • 题解:CF118E
    Tarjan思路先来看一下题目给出的无解的这个样例。不难发现,导致无解的两条边就是\(6-7\)和\(2-4\)这两个桥。所以这个题就转换成了求桥,如果存在桥就是无解。代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+5,M=3e5+5;inlineintread();intn,......