【THUPC 2024 初赛】 E 转化
【THUPC 2024 初赛】 转化
我都能做出来,那就是大水题了。
思路
首先我们要确定最大可以变色的球的数量
有如下两个贪心步骤:
-
- 所有颜色使用分裂操作,并更新
。
- 所有颜色使用分裂操作,并更新
此时的有
-
- 若
大于 ,给 和 都不为 的点,分配一个球,执行完分裂 次后,更新 ,更新 。
- 若
这两个贪心步骤可以保证
对于 1 如果一个点有球,那么从别处变色球来分裂肯定不优;对于 2,不难发现,执行完后
对于每一个颜色
如果
对于全局最大值,在执行完上述操作中的
全局最大答案为:
时间复杂度
CODE
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+5;
#define int long long
#define ll long long
struct node
{
int c,id;
}edge[maxn];
ll n,fs,ct;
ll a[maxn],b[maxn],c[maxn];
bool cmp(ll a,ll b){return a>b;}
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
for(int i=1;i<=n;i++) scanf("%lld",&c[i]);
for(int i=1;i<=n;i++)
{
if(a[i]==0) continue;
a[i]+=c[i];
c[i]=0;
ll t=min(a[i],b[i]);
fs+=t;
b[i]-=t;
a[i]-=t;
}
for(int i=1;i<=n;i++)
{
if(b[i]&&c[i]&&fs)
{
fs--;
a[i]=1+c[i];
c[i]=0;
ll t=min(b[i],a[i]);
b[i]-=t;
a[i]-=t;
fs+=t;
}
}
ll totans=0;
for(int i=1;i<=n;i++)
{
totans+=a[i];
ll t=fs+a[i];
if(t) t+=c[i];
printf("%lld ",t);
}
sort(c+1,c+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(c[i]&&fs)
{
fs--;
totans+=1+c[i];
}
}
printf("\n%lld",totans+fs);
}
赛时代码比较艹,所以读者自己写一次的好。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现