首页 > 其他分享 >[题解] CF505E Mr. Kitayuta vs. Bamboos

[题解] CF505E Mr. Kitayuta vs. Bamboos

时间:2023-11-12 09:00:45浏览次数:36  
标签:Bamboos le int 题解 ll mid Read vs MAXN

Mr. Kitayuta vs. Bamboos

给定 \(n\) 个数 \(h_{1 \dots n}\)。
你需要进行 \(m\) 轮操作,每轮操作为 \(k\) 次修改,每次修改可以选择一个数 \(h_i\) 修改为 \(\max(h_i - p, 0)\)。
每轮操作后每个 \(h_i\) 将会被修改为 \(h_i + a_i\)。
你需要最小化最终 \(h_{1 \cdots n}\) 中的最大值。
\(n \le 10^5\),\(m \le 5 \times 10^3\),\(k \le 10\)。

二分答案,考虑如何 check。

正着做要考虑对 0 取 max,比较麻烦,所以可以时光倒流。然后问题就变成了初始有 \(n\) 个数,每个都是 \(mid\),每个时刻第 \(i\) 个会减少 \(a_i\),你每个时刻可以进行 \(k\) 次操作,每次操作是选一个数让他加 \(p\),求能不能在 \(m\) 个时刻后让每个数都大于等于 \(h_i\),还要保证每个时刻数都非负。

这个可以贪心地去做,按还剩多少天减成负数维护一个堆,然后每次取出堆顶,对他操作一次,最后判断堆是否为空就行。

时间复杂度 \(O((n + mk) \log n\)。

constexpr int MAXN = 1e5 + 9, MAXM = 5e3 + 9, MAXK = 11;
int n, m, k, p, h[MAXN], a[MAXN], cnt[MAXN];

bool check(ll x) {
	priority_queue<pli, vector<pli>, greater<pli> > q;
	for (int i = 1; i <= n; i ++) {
		if (x - 1ll * m * a[i] >= h[i]) continue;
		q.emplace(x / a[i], i), cnt[i] = 0;
	}
	for (int i = 1; i <= m; i ++)
		for (int j = 1; j <= k; j ++) {
			if (q.empty()) return true;
			auto [day, id] = q.top(); q.pop();
			if (day < i) return false; cnt[id] ++;
			day = (x + 1ll * p * cnt[id]) / a[id];
			if (x - 1ll * a[id] * m + 1ll * p * cnt[id] < h[id])
				q.emplace(day, id);
		}
	if (q.size()) return false;
	else return true;
}

void slv() {
	n = Read<int>(), m = Read<int>(), k = Read<int>(), p = Read<int>();
	for (int i = 1; i <= n; i ++) h[i] = Read<int>(), a[i] = Read<int>();
	ll l = 0, r = 1e13;
	while (l < r) {
		ll mid = l + r >> 1;
		if (check(mid)) r = mid;
		else l = mid + 1;
	}
	Write(l, '\n');
	return;
}

标签:Bamboos,le,int,题解,ll,mid,Read,vs,MAXN
From: https://www.cnblogs.com/definieren/p/17826743.html

相关文章

  • vscode 如何调试 php 应用?
    使用的是WNMP的集成环境,服务启用后,如何用vscode对php代码进行断点调试?之前是使用PHPStorm进行断点调试的,想知道vscode能否实现类似的断点调试功能,。要在VSCode中调试PHP应用程序,你可以按照以下步骤进行设置和调试:安装PHP扩展:在VSCode的扩展市场中,搜索并安装PHP扩展......
  • 【题解 P8763】[蓝桥杯 2021 国 ABC] 异或变换
    同楼上dalao做法:#include<iostream>#include<algorithm>#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<cstdlib>#include<bitset>usingnamespacestd;constintN=1e4+10......
  • ABC328题解(C-G)
    A/B较为简单,略去。C预处理一下,然后前缀和就好了。时间复杂度\(O(n)\)。D用链表来记录字符串。注意到每次能够消去意味着链表上连续三个节点拼起来是ABC,然后从左到右一个个算就行了。匹配到的话把三个节点一起删掉。时间复杂度\(O(n)\)。E注意到\(N\le8,M\le28\)......
  • 2022新生赛 玩石头 题解
    这题乍一看是个背包,但是它对背包物品的重量进行了限制,而且我们没有手段得知当前物品是否大于前面所有物品。研究发现,纪念品最大价值不会超过4000.因此我们可以用类似于01背包的做法,以纪念品价值作为重量,纪念品重量作为价值来dp.打表可以发现,在给定数据的范围下,石头塔最多为三十层,......
  • P9836 种树 题解
    蒟蒻在考场上花了2h45minAC本题通过高度求宽度定义一棵树的宽度为它高度的正因数个数我们可以预处理\(10^4\)之内素数。 for(lli=2;i<=10000;i++){ if(ok[i]==0){ ok[i]=i; pr[++nP]=i; } for(llj=1;i*pr[j]<=10000&&j<=nP;j++){ ok[i*pr[j]]=......
  • [题解] CF1327F AND Segments
    ANDSegments有\(m\)个限制\((l,r,x)\)。要计算满足以下条件的长度为\(n\)的序列\(a\)的数量:\(\foralli\in[1,n],0\lea_i<2^k\)。\(\foralli\in[1,m],a_{l_i}\operatorname{and}a_{l_i+1}\operatorname{and}\cdots\operatorname{and}a_{r......
  • 【洛谷 P1035】[NOIP2002 普及组] 级数求和 题解(循环)
    [NOIP2002普及组]级数求和题目描述已知:。显然对于任意一个整数,当足够大的时候,。现给出一个整数,要求计算出一个最小的,使得。输入格式一个正整数。输出格式一个正整数。样例#1样例输入#11样例输出#12提示【数据范围】对于的数据,。【题目来源】NOIP2002普及组第一题......
  • k8s service ipvs模式下nodePort实现
    部署nodePort+StatefulSetapiVersion:v1kind:Servicemetadata:name:nginxspec:ports:-port:80selector:app:nginxtype:NodePort---apiVersion:apps/v1kind:StatefulSetmetadata:name:nginxspec:podManagementPolicy:Parallels......
  • AT_agc057_e 题解
    AT_agc057_e[0]约定\(r_i=\sum\limits_{j=1}^{m}[A_{i,j}\lek]\)\(r^{'}_i=\sum\limits_{j=1}^{m}[B_{i,j}\lek]\)\(c_j=\sum\limits_{i=1}^{n}[A_{i,j}\lek]\)\(c^{'}_j=\sum\limits_{i=1}^{n}[B_{i,j}\lek]\)[1]......
  • [题解] AT_dp_w Intervals
    Intervals有\(m\)条形如\((l,r,a)\)的限制,表示如果\(s_{[l,r]}\)中有1就会有\(a\)的价值。你要求长度为\(n\)的01串的价值的最大值。\(n,m\le2\times10^5\)。将每个限制挂到右端点上,在右端点处计算贡献。然后我们就只关心最后一个1出现的位置了。......