CF1870D Prefix Purchase 题解
CF1870D Prefix Purchase 题解
题意#
你有一个长为
初始你有
问
思路#
萌新竟然能切 D 了!!!
首先考虑 dp。记
发现这样复杂度过于炸裂。我们考虑 dp 做的是什么,就是优先选尽可能多的
考虑如何选尽可能多的
复杂度
代码#
萌新代码有点丑,大佬不要嫌弃
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int ans=0;bool op=0;char ch=getchar();
while(ch<'0'||'9'<ch){if(ch=='-')op=1;ch=getchar();}
while('0'<=ch&&ch<='9'){ans=(ans<<1)+(ans<<3)+(ch^48);ch=getchar();}
if(op)return -ans;
return ans;
}
const int maxn=2e5+10;
int n,k;
int c[maxn];
int mn[maxn];//c的后缀最小值的下标
int a[maxn];//最终形成的序列
struct node{
int val,cnt,id;//这个c的权值、数量、编号
bool operator < (const node &cmp)const{
return val<cmp.val||(val==cmp.val&&id>cmp.id);
}
};
priority_queue<node>q;
void real_main(){
//read
n=read();
for(int i=1;i<=n;i++)c[i]=read();
k=read();
//init
//清空
while(!q.empty())q.pop();
memset(a,0,sizeof(int)*(n+2));
mn[n]=n;
for(int i=n-1;i>=1;i--)mn[i]=c[i]<c[mn[i+1]]?i:mn[i+1];//处理后缀最小值的下标
q.push((node){0,(int)2e9,0});//加一个0,方便处理
//solve
for(int i=1;i<=n;i++){
node awa=(node){c[mn[i]],0,mn[i]};
while(!q.empty()){
node now=q.top();q.pop();
int dif=c[mn[i]]-now.val;
if(!dif){//如果不用替换,那么直接退出
q.push(now);//拿出来的没有动,放回去
break;
}
int tmp=min(k/dif,now.cnt);//计算一下可以替换掉几个
now.cnt-=tmp;
awa.cnt+=tmp;
a[now.id]-=tmp;
a[mn[i]]+=tmp;
k-=dif*tmp;
if(now.cnt)q.push(now);
if(!tmp)break;//已经不能替换了,退出
}
if(awa.cnt)q.push(awa);
}
for(int i=n;i>=1;i--)a[i]=a[i+1]+a[i];//我们的a是一个后缀和,算出来
for(int i=1;i<=n;i++)cout<<a[i]<<' ';
puts("");
}
signed main(){
int T=read();//多组数据
while(T--)real_main();
return 0;
}s
标签:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】