蚯蚓-------------------------------思维(队列)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
解析:
性质:蚯蚓i长度>蚯蚓j长度。i蚯蚓切断后的两端长度都大于j蚯蚓切断后的两端长度。因此单调递减

根据性质我们用三个队列来模拟优先队列。
一个队列存放蚯蚓的长度。一个队列存放切断蚯蚓后左边的长度,一个队列存放切断蚯蚓后右边的长度。因此每次找最长的蚯蚓,我们只要比较着三个队列的队头谁最大即可。
用一个额外变量存储每次蚯蚓增加的长度,队列里面保持长度没有增加过

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=7e6+1000;
ll a[N];
ll n,m,q,u,v,t;
queue<ll> q1,q2,q3;
bool cmp(int a,int b)
{
	return a>b;
}
ll calc(int t)
{
	int x=-1e8,a=-1e8,b=-1e8,c=-1e8;
	if(!q1.empty())  a=q1.front()+t*q;
	if(!q2.empty())  b=q2.front()+t*q;
	if(!q3.empty())  c=q3.front()+t*q;
	x=max(a,max(b,c));
	if(x==a) q1.pop();
	else if(x==b) q2.pop();
	else if(x==c) q3.pop();
	return x;
}
int main()
{
	cin>>n>>m>>q>>u>>v>>t;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+1+n,cmp); 
	for(int i=1;i<=n;i++) q1.push(a[i]);
	for(int i=1;i<=m;i++)
	{
		ll x=calc(i-1);
		if(i%t==0) cout<<x<<" ";
		int now=x*u/v;
		int now1=x-now;
		q2.push(now-i*q);
		q3.push(now1-i*q);
	}
	cout<<endl;
	for(int i=1;i<=n+m;i++)
	{
		ll x=calc(m);
		if(i%t==0) cout<<x<<" "; 
		
	 } 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值