Codefoces802O April Fools' Problem (hard)

本文介绍了一种结合费用流模型与带权二分法的算法,用于解决特定类型的最优化问题。通过建立费用流模型,将问题转化为寻找最小成本的匹配方案,再利用带权二分法快速定位最优解。文章提供了详细的算法实现过程及代码示例。

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

Problem

Codeforces

Solution

这鬼题为什么一脸可以DP的样子?我D了半天都没列出方程QAQ
队长:这不是显然费用流吗?

惨遭嘲讽

队长:我就看了一会


从费用流模型入手,那么就是就是把A点,向每一个后面的B点连边,这样边是 O ( n 2 ) O(n^2) O(n2)级别的。然而其实可以优化这些边,把每个B点都向后连INF,费用为0的边即可。边数变为了 O ( n ) O(n) O(n)的。

然后费用流只能帮你到这了,但我们可以利用这个模型继续分析。从费用的特点来考虑,关于做的题目数量和最小花费是单调不降的。即这个函数的斜率是不降的,就可以带权二分。

找函数最小值就是直接贪心,把B都减去二分的值,然后有两种可能,一种是配对,一种是代替前面的某个被配对的B。A用小根堆维护,B用大根堆维护即可。

时间复杂度 O ( n log ⁡ n log ⁡ v ) O(n\log n\log v) O(nlognlogv)

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=500010;
template <typename Tp> inline int getmin(Tp &x,Tp y){return y<x?x=y,1:0;}
template <typename Tp> inline int getmax(Tp &x,Tp y){return y>x?x=y,1:0;}
template <typename Tp> inline void read(Tp &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') f=1,ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    if(f) x=-x;
}
int n,k,m,L,R=2e9,cnt,a[maxn],b[maxn];
ll ans=1e18,sum;
struct Heap{
	int p,a[maxn];
	void push(int x){a[++p]=x;push_heap(a+1,a+p+1);}
	void pop(){pop_heap(a+1,a+p+1);--p;}
}H;
struct GHeap{
	int p,a[maxn];
	void push(int x){a[++p]=x;push_heap(a+1,a+p+1,greater<int>() );}
	void pop(){pop_heap(a+1,a+p+1,greater<int>() );--p;}
}GH;
void check(int m)
{
	int x1,x2;
	H.p=GH.p=0;cnt=0;sum=0ll;
	for(int i=1;i<=n;i++)
	{
		x2=2e9;
		GH.push(a[i]);
		x1=b[i]-m+GH.a[1];//insert
		if(H.p>0) x2=b[i]-H.a[1];//replace
		if(x1>=0&&x2>=0) continue;
		if(x1<=x2)
		{
			++cnt;sum+=x1;
			GH.pop();H.push(b[i]);
		}
		if(x1>x2){sum+=x2;H.pop();H.push(b[i]);}
	}
}
int main()
{
	read(n);read(k);
	for(int i=1;i<=n;i++) read(a[i]);
	for(int i=1;i<=n;i++) read(b[i]);
	while(L<=R)
	{
		m=((ll)L+R)>>1;check(m);
		if(cnt>=k)
		{
			ans=sum+(ll)k*m;
			R=m-1;
		}
		else L=m+1;
	}
	printf("%lld\n",ans);
	return 0;
}
### 关于2025年愚人节技术笑话或IT相关事件的信息 目前关于具体日期如2025年的愚人节(April Fools' Day 2025)上的科技笑话或IT相关活动尚未有确切记录。然而,可以推测的是,在这一天可能会延续以往的传统,各大科技公司和媒体会发布一些具有创意和技术背景的恶作剧内容[^1]。 通常情况下,每年的愚人节期间,许多知名的技术企业都会利用这一机会推出虚构的产品或者服务来娱乐公众。例如谷歌曾宣布过不存在的功能如“Google Nose”用于嗅觉搜索;又比如特斯拉可能开玩笑说他们开发了一款可以在火星上种植植物的家庭设备等等。这些玩笑往往基于当前快速发展的科学技术趋势之上,并结合幽默感吸引人们的注意[^2]。 尽管现在还没有针对2025年具体的计划被公开披露出来,但随着人工智能、量子计算以及其他前沿领域研究不断取得进展,未来几年里我们可以期待更加复杂且令人惊叹的 April Fools’ pranks from tech giants. 对于个人而言,也可以尝试自己动手制作简单的程序作为朋友间的玩笑材料。下面提供了一个简单Python脚本例子,它假装能够预测用户的幸运号码: ```python import random def get_lucky_number(name): lucky_number = random.randint(1, 100) return f"{name}, your predicted lucky number is {lucky_number}!" print(get_lucky_number(input("Enter your name to predict your lucky number: "))) ``` 此代码接受输入的名字并随机生成一个介于1到100之间的整数作为所谓的“幸运号”。虽然这只是个小把戏,但在特定场合下却能增添不少乐趣。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值