Luogu2827 「NOIP2016」 蚯蚓

Description

link

Solution

相当 naiveO(mlogn) 的做法还是比较好说的

有个结论:先被砍的蚯蚓的长度的在当前时刻的剩余会比现在砍的剩余大

证明很简单,设数算一下就行了

那么这题目上手维护三个单调队列,最后揉起来算即可

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define reg register
namespace yspm{
	inline int read(){
		int res=0,f=1; char k;
		while(!isdigit(k=getchar())) if(k=='-') f=-1;
		while(isdigit(k)) res=res*10+k-'0',k=getchar();
		return res*f;
	}
	const int N=1e5+10,M=7e6+10;
	int a[N],n,m,zsy,u,v,t,sum;
	priority_queue<int> ans;
	int q1[M],q2[M],q3[M],h1,h2,h3,t1,t2,t3;
	inline bool cmp(int x,int y){return x>y;}
	signed main(){
		n=read(); m=read(); zsy=read(); double p=read(); p/=read(); t=read();
		for(reg int i=1;i<=n;++i) a[i]=read();
		h1=h2=h3=1; t1=n,t2=t3=0;
		sort(a+1,a+n+1,cmp);
		for(reg int i=1;i<=n;++i) q1[i]=a[i];
		for(reg int i=1,rem1,rem2,mx=0,id=0;i<=m;++i) 
		{
			mx=0; 
			if(t1>=h1){
				if(q1[h1]>=q2[h2]&&q1[h1]>=q3[h3]) mx=q1[h1],++h1;
				else if(q2[h2]>=q1[h1]&&q2[h2]>=q3[h3]) mx=q2[h2],++h2;
				else mx=q3[h3],++h3;
			}else{
				if(q2[h2]>=q3[h3]) mx=q2[h2],++h2;
				else mx=q3[h3],++h3;
			}
			if(i%t==0){
				printf("%lld ",mx+sum);
			} mx+=sum;
			rem1=floor(mx*p); rem2=mx-rem1;
			sum+=zsy; 
			q2[++t2]=rem1-sum; q3[++t3]=rem2-sum;
		} puts("");
		for(reg int i=h1;i<=t1;++i) ans.push(q1[i]);
		for(reg int i=h2;i<=t2;++i) ans.push(q2[i]);
		for(reg int i=h3;i<=t3;++i) ans.push(q3[i]);
		int cnt=0; 
		while(ans.size()){
			++cnt; if(cnt%t==0) printf("%lld ",sum+ans.top()); 
			ans.pop();
		}puts("");
		return 0;
	}
}
signed main(){return yspm::main();}
posted @   没学完四大礼包不改名  阅读(106)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示