洛谷 #2827. 蚯蚓

本文探讨了一种关于蚯蚓切割的算法问题,通过分析切割顺序的单调性,提出了一种无需使用大根堆的高效解决方案。文章详细介绍了算法实现过程,包括输入处理、排序、切割操作及结果输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

有n只stupid蚯蚓,每次把最长的切成两条蚯蚓,切口比例会给出
询问第t次,第2t次…切割的蚯蚓的原长度,把最终的长度排序后输出

题解

看起来像是大根堆是不是,然而只能拿85分
事实上根本不用堆

(但是标签里有堆)(但是标签里有堆)()

注意到,先切割的蚯蚓的切割后的长度必定大与后切割的(也就是自带单调性)
然后就和平了

调试记录

因为用了sigma这个东西,所以max初值要赋得小
#include <cstdio>
#include <algorithm>
#include <functional>
#include <queue>
#define maxn 8000005
#define INF 0x3f3f3f3f
#define int long long

using namespace std;

int a[3][maxn], head[3], tail[3];
int n, m, q, u, v, t, sigma = 0;
double p;
int temp[maxn];

signed main(){
	head[0] = head[1] = head[2] = 1;
	tail[0] = tail[1] = tail[2] = 0;
	scanf("%lld%lld%lld%lld%lld%lld", &n, &m, &q, &u, &v, &t);
	p = 1.0 * u / v;
	
	for (int i = 1; i <= n; i++) scanf("%lld", &a[0][++tail[0]]);
	sort(a[0] + 1, a[0] + n + 1, greater<int>());
	
	for (int i = 1; i <= m; i++){
		int mx = -INF, id = -1;
		
		for (int k = 0; k < 3; k++){
			if (a[k][head[k]] > mx && head[k] <= tail[k]){
				mx = a[k][head[k]]; id = k;
			}
		}
		
		int a1 = (long long)((a[id][head[id]] + sigma) * p);
		int a2 = a[id][head[id]] + sigma - a1;
		
		if (i % t == 0) printf("%lld ", a[id][head[id]] + sigma);
		
		sigma += q;
		a[1][++tail[1]] = a1 - sigma;
		a[2][++tail[2]] = a2 - sigma;
		++head[id];
	} printf("\n");
	
	for (int i = 1; i <= n + m; i++){
		int mx = -INF, id = -1;
		for (int k = 0; k < 3; k++){
			if (a[k][head[k]] > mx && head[k] <= tail[k]){
				mx = a[k][head[k]]; id = k;
			} 
		}
		
		if (i % t == 0) printf("%lld ", mx + sigma);
		head[id]++;
	} printf("\n");
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值