首页 > 其他分享 >ARC125E Snack

ARC125E Snack

时间:2024-08-14 19:39:49浏览次数:16  
标签:Snack const int ARC125E i128 include ifo define

小清新网络流优化题

首先不难想到一个 trivial 的网络流模型,即建立源点 \(S\) 和汇点 \(T\)

对于每个食物 \(i\),连 \(S\to i\),容量为 \(A_i\) 的边;对于每个人 \(j\),连 \(j\to T\),容量为 \(C_j\) 的边;同时所有食物向每个人 \(j\) 连容量为 \(B_j\) 的边

直接跑 Dinic 复杂度显然爆了,但这个图具有很强的性质,考虑手动找出它的最大流

首先用最大流最小割定理转为求最小割,枚举最后要断掉和 \(S\) 相邻的 \(x\) 条边

手玩发现由于左边每个点向右连出的边都相同,因此显然是断开最小的 \(x\) 条边

再考虑此时右边的每个点 \(j\),要么断开它和 \(T\) 的边,代价为 \(C_j\);要么断开中间的边,代价为 \((n-x)\times B_j\)

考虑从小到大枚举 \(x\),把人按照 \(\frac{C_j}{B_j}\) 排序后 two pointers 扫一遍即可

#include<cstdio>
#include<iostream>
#include<algorithm>
#define int long long
#define RI register int
#define CI const int&
using namespace std;
typedef __int128 i128;
const int N=200005;
struct ifo
{
    int b,c;
    friend inline bool operator < (const ifo& A,const ifo& B)
    {
        return i128(A.c)*B.b>i128(A.b)*B.c;
    }
}p[N]; int n,m,a[N];
signed main()
{
    scanf("%lld%lld",&n,&m);
    for (RI i=1;i<=n;++i) scanf("%lld",&a[i]);
    for (RI i=1;i<=m;++i) scanf("%lld",&p[i].b);
    for (RI i=1;i<=m;++i) scanf("%lld",&p[i].c);
    sort(a+1,a+n+1); sort(p+1,p+m+1);
    int ans=1e18,suma=0,sumb=0,sumc=0;
    for (RI i=1;i<=m;++i) sumc+=p[i].c;
    for (RI i=0,j=1;i<=n;++i)
    {
        while (j<=m&&(n-i)*p[j].b<=p[j].c)
        sumb+=p[j].b,sumc-=p[j].c,++j;
        suma+=a[i]; ans=min(ans,suma+(n-i)*sumb+sumc);
    }
    return printf("%lld",ans),0;
}

标签:Snack,const,int,ARC125E,i128,include,ifo,define
From: https://www.cnblogs.com/cjjsb/p/18359640

相关文章

  • Solution - Atcoder ARC125E Snack
    观察到这种都是数量上限的限制,且求\(\max\)。所以可以考虑网络流建模,而流量就对应着给的糖果数。令\(S\)为源点,\(T\)为汇点,编号为\(1\simn\)的点对应的糖果的种类,编号为\(n+1\simn+m\)的点对应的小孩。连边\((S,i,a_i)\),表示第\(i\)种糖果数不超过\(a_i\)......
  • mvvmtoolkit+snackbar弹窗消息通知
    需求场景:在MainView.xaml下添加一个SnackBar并将其ZIndex设置成1,后续所有的消息弹窗都通过MainView来展示代码设置:MVVMToolkit+MaterDesigner组+全局静态类MainView下添加SnackBar,SnackBar下的消息数据以及是否展示属性绑定至一个全局消息类中,后续所有的消息展示则可以通过......
  • [ARC125E] Snack
    [ARC125E]Snack经典啊,经典。很容易看出网络流模型:每个人连一个限制\(c_i\),每种糖果拆点限流\(a_i\),然后每个人向每个糖果连边,最大流就是答案。考虑转成最小割,我们相当于选出两个集合\(S\subseteq[1,n],T\subseteq[1,m]\),割就是\(\sum_{i\inS}a_i+\sum_{i\notin......
  • 题解 Cow and Snacks
    被黄题创死了2333题目链接首先肯定有一个贪心的想法:尽量使得人们拿的花重复,即尽量使得每个人都拿一束花。当然第一个人必须拿两束。接着思考:如何找出有几个人是必须拿两束花的。其实很简单,当\(A,B\)两人不能通过其他人使得他们的花有联系,比如\(A\)喜欢\(1,2\),\(B\)喜欢......
  • [ARC125E] Snack 题解
    不难发现一个较简单的网络流模型:源点向所有糖果\(i\)连\(a_i\)的容量;所有糖果向所有人\(i\)连\(b_i\)的容量;所有人\(i\)向汇点连\(c_i\)的容量。但第二步中建出的边数达到了惊人的\(O(nm)\),显然过不去。考虑优化。从最大流角度优化较困难,由于最大流等价于最小......
  • AtCoder Regular Contest 125 E Snack
    洛谷传送门AtCoder传送门很棒的flow题,考虑建二分图。源点向每种零食连边权为\(a_i\)的边,每种零食向每个孩子连边权为\(b_j\)的边,每个孩子向汇点连边权为\(c_j\)的边,这个图的最大流就是答案。直接跑最大流肯定T,考虑最大流等价于求这个图的最小割,因此转而求最小割。......
  • 高性能 Jsonpath 框架,Snack3 3.2.65 发布
    高性能Jsonpath框架,Snack33.2.65发布来源:投稿作者: 梅子酒好吃2023-04-1014:18:00 0Snack3,一个高性能的JsonPath框架借鉴了Javascript所有变量由var申明,及Xmldom一切都是Node的设计。其下一切数据都以ONode表示,ONode也即Onenode之意,代......
  • 高性能 Jsonpath 框架,Snack3 3.2.57 发布
    Snack3,一个高性能的JsonPath框架借鉴了Javascript所有变量由var申明,及Xmldom一切都是Node的设计。其下一切数据都以ONode表示,ONode也即Onenode之意,代表任何......
  • 高性能 Jsonpath 框架,Snack3 3.2.54 发布(支持 kotlin data 类反序化)
    Snack3,一个高性能的JsonPath框架借鉴了Javascript所有变量由var申明,及Xmldom一切都是Node的设计。其下一切数据都以ONode表示,ONode也即Onenode之意,代表任何......
  • 高性能 Jsonpath 框架,Snack3 3.2.50 发布
    Snack3,一个高性能的JsonPath框架借鉴了Javascript所有变量由var申明,及Xmldom一切都是Node的设计。其下一切数据都以ONode表示,ONode也即Onenode之意,代表任何......