AT_arc125_e Snack 题解
题目链接:ARC125E - Snack
题目是非常简单的网络流模板,源点连糖果,糖果连小朋友,小朋友连汇点,问题是边数是 $ O(NM) $ 的,显然不可行
考虑最大流 = 最小割,则原图的最大流对应一个割掉一些源点连糖果的边,割掉一些小朋友连汇点的边,然后割掉剩下所有没有割掉与源点/汇点相连的糖果/小朋友两两之间的边割掉,具体来说,假设删掉的糖果点集为 $ A $,删掉的人的点集为 $ C $,则答案为以下式子的最小值:
\[\sum_{i \in A} a_i + \sum_{i \in C} c_i + \sum_{i \notin C} b_i(n-|A|)
\]
然后上面式子的最小值显然和下面的式子的最小值相等
\[\sum_{i \in A} a_i + \sum_{i=1}^{m} \min (c_i, b_i(n-|A|))
\]
前一项在固定 $ |A| $ 的情况下一定是取最小的若干个 $ a_i $,右边的 $ \min $ 中显然后一项随着 $ |A| $ 增大逐渐减小,因此可以按 $ \frac{c_i}{b_i} $ 排序,然后前缀和,二分(或者维护一个单调指针)即可。
代码:
#include<bits/stdc++.h>
#define time(null) chrono::steady_clock::now().time_since_epoch().count()
#define int long long
#define uint unsigned long long
#define debug() cout<<"come here\n"
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define pb push_back
#define Code return
#define by 0
#define MCYYDS ;
using namespace std;
int qpow(int a,int b,int p=INF){int ret=1;while(b){if(b&1)ret=(ret*a)%p;a=(a*a)%p;b>>=1;}return ret;}
inline int read(){int ret=0,f=1;char ch=getchar();while(ch<'0'||ch>'9')f=(ch=='-'?-1:f),ch=getchar();while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+(ch^48),ch=getchar();return ret*f;}
inline void write(int x){if(x<0){putchar('-');write(-x);return ;}if(x>9)write(x/10);putchar((char)(x%10+48));}
inline void writech(int x,char ch){write(x);putchar(ch);}
struct node{
int x,b,c;
};
bool cmp(node x,node y)
{
return x.x<y.x;
}
signed main()
{
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
int n=read(),m=read();
vector<int> a(n+1,0);
vector<node> p(m+1,{0,0,0});
for(int i=1;i<=n;i++)
{
a[i]=read();
}
for(int i=1;i<=m;i++)
{
p[i].b=read();
}
for(int i=1;i<=m;i++)
{
p[i].c=read();
p[i].x=p[i].c/p[i].b+1;
}
sort(a.begin()+1,a.begin()+n+1);
sort(p.begin()+1,p.begin()+m+1,cmp);
vector<int> cs(m+1,0),bs(m+1,0);
for(int i=1;i<=m;i++)
{
cs[i]=cs[i-1]+p[i].c;
bs[i]=bs[i-1]+p[i].b;
}
int sum=0,ans=INF;
for(int i=0;i<=n;i++)
{
sum+=a[i];
int l=1,r=m;
while(l<=r)
{
int mid=l+r>>1;
if(n-i>=p[mid].x)l=mid+1;
else r=mid-1;
}
ans=min(ans,sum+cs[r]+(bs[m]-bs[r])*(n-i));
}
writech(ans,'\n');
Code by MCYYDS
}

浙公网安备 33010602011771号