首页 > 其他分享 >【题解】AtCoder abc332_g Not Too Many Balls

【题解】AtCoder abc332_g Not Too Many Balls

时间:2023-12-11 09:01:24浏览次数:34  
标签:AtCoder sumAi notin min 题解 sum Balls sumi abc332

传送门:https://atcoder.jp/contests/abc332/tasks/abc332_g

看完题,第一眼反应为最大流。
建模方式为:以颜色为左部点,盒子为右部点,源点 $S$ 向颜色 $i$ 连一条容量为 $A_i$ 的边,盒子 $j$ 向汇点 $T$ 连一条容量为 $B_j$ 的边,颜色 $i$ 向盒子 $j$ 连一条容量为 $ij$ 的边;在这张图上跑最大流即可得到答案。
但问题来了:这张图一共有 $O(n+m)$ 个点,$O(nm)$ 条边,$Dinic$ 最大流的复杂度为 $O(V^2E)$,在本题显然难以接受。
考虑能否优化最大流。一个比较常规的想法是,由于最大流=最小割,所以我们可以尝试从最小割的角度思考,或许不需要使用最大流算法即可求出最小割。
(注:以下 $i$ 均代表颜色,$j$ 均代表盒子)
最小割的要求是“割完边后的图中不能存在 $S$ 到 $T$ 的路径”,而要满足这个要求,对于任意一组 $i$ 和 $j$,$(S$, $i)$、$(i$, $j)$、$(j$, $T)$ 三条边中,必须至少有一条被割掉(否则就会形成路径);而如果 $(S$, $i)$、$(j$, $T)$ 之中有至少一条边被割,那么 $(i$, $j)$ 显然就没有割的必要了;
因此,设我们割掉 $S$ 到集合 $S_1$ 中的颜色的边、集合 $S_2$ 中的盒子到 $T$ 的边,代价为 $\sum_{i\in S_1}A_i+\sum_{j\in S_2}B_j+\sum_{i\notin S_1}\sum_{j\notin S_2}ij=\sum_{i\in S_1}A_i+\sum_{j\in S_2}B_j+(\sum_{i\notin S_1}i)(\sum_{j\notin S_2}j)$,而我们要求出这个式子的最小值;
观察到 $N$ 的范围只有 $500$,所以考虑从颜色入手;容易发现我们可以枚举 $\sum_{i\notin S_1}i$(以下记作 $sumi$),而如果确定了 $sumi$ 的值,那么 $\sum_{i\in S_1}A_i$(以下记作 $sumAi$)越小越好,它的最小值我们可以预先 $dp$ 求出(比较简单,此处略过);此时我们相当于枚举了一组 $sumi、sumAi$ 的值;
而在 $sumi、sumAi$ 确定的情况下,对于每个 $j$,如果它进入 $S_2$,它会对式子带来 $B_j$ 的贡献;反之,它会带来 $sumi*j$ 的贡献;所有 $j$ 的选择(是否进入 $S_2$)是彼此无关的,所以对于每个 $j$,它的贡献直接取二者的最小值即可,即 $min(B_j,sumi*j)$;
下面要做的事就仅剩:在 $sumi、sumAi$ 确定的情况下,快速计算 $\sum_{j=1}^{M}min(B_j,sumi*j)$;考虑消去 $min$,对于每个 $j$ 而言,在 $sumi<=\lfloor{B_j/j}\rfloor$ 时,取 $sumi*j$ 更优,反之取 $B_j$ 更优;我们把所有 $j$ 按照 $\lfloor{B_j/j}\rfloor$ 排序,则对于任意 $sumi$,满足 $sumi<=\lfloor{B_j/j}\rfloor$ 的 $j$ 一定是区间右侧一段,不满足的一定是区间左侧一段;从小到大枚举 $sumi$,每次右移 $j$ 的两段之间的分隔线,提前计算排序后的 $j$ 序列上 $j$ 和 $B_j$ 分别的前缀和,即可在总共 $O(n^2+m)$ 的时间内计算出所有 $sumi$ 对应的最优答案,取 $min$ 即为题目答案。

标签:AtCoder,sumAi,notin,min,题解,sum,Balls,sumi,abc332
From: https://www.cnblogs.com/hellstairs/p/17893626.html

相关文章

  • AtCoder Beginner Contest 332
    AtCoderBeginnerContest332A-OnlineShoppingintmain(){IOS;for(_=1;_;--_){cin>>n>>m>>k;llans=0;rep(i,1,n){lla,b;cin>>a>>b;ans+=a......
  • Atcoder abc301 复盘(更新中)
    跳转比赛链接A-OverallWinner简述:高桥和青木下了\(N\)盘棋。给你一个长度为\(N\)的字符串\(S\),表示这两盘棋的结果。如果\(S\)的\(i\)个字符是t,那么高桥赢得了\(i\)局;如果\(S\)的\(i\)个字符是A,那么青木赢得了这局。高桥和青木之间的胜负关系是谁赢的局......
  • AtCoder Beginner Contest 331 G - Collect Them All【概率期望+容斥+多项式】
    题目链接:ABC331_G写在前面将来如果回顾这道题,建议自己看完题意一定先重新推一遍。如果还是不够熟练,多去做一些同类型的题目吧。题意:盒子里有\(N\)张卡片,每张卡片上写着一个数字,数字的范围是\(1,...,M\),写着数字\(i\)的卡片有\(C_i\)张\((C_i>0)\)。有放回地抽取卡片,每......
  • AT_cf17_final_j Tree MST 题解
    题意:给定一颗\(n\)个点的树,点\(i\)有权值\(a_{i}\),边有边权。现在有另外一个完全图,两点之间的边权为树上两点之间的距离加上树上两点的点权,求这张完全图的最小生成树。首先有一个很显然的暴力,把完全图中每两点之间的边权算出来,然后跑一边最小生成树,时间复杂度\(O(n^{2}\lo......
  • P7735 [NOI2021] 轻重边 题解
    是一道树剖好题,之前听lsl讲过一点,于是很快就做出来了。题意:有一个\(n\)个节点的树,最开始的时候所有边都是轻边,维护两个操作:操作一:将\(u\)到\(v\)的路径中经过的所有点的邻边变为轻边,再将这条路径上的边变为重边。操作二:求出\(u\)到\(v\)这条路径上有多少条重边......
  • 小程序建立用户与数据的联系问题解决方案
    在小程序中建立用户与数据的联系是一个常见的问题,在本文中提供了一个解决方案。这个解决方案包括几个关键步骤。首先,需要通过用户登录功能实现用户的身份识别,并获取到用户的唯一标识符。接着,需要在后台数据库中创建一个用户表,用于存储用户的基本信息和与之相关联的数据。在这个表中......
  • ARC169 B Subsegments with Small Sums 题解
    LinkARC169BSubsegmentswithSmallSumsQuestion\(x\)是一个序列,定义\(f(x)\)为把序列\(x\)切成几段,每段的和不能超过\(S\)的最小段数给出序列\(A=(A_1,A_2,\cdots,A_N)\)求:\[\sum_{1\lel\leN}f((A_l,A_{l+1},\cdots,A_r))\]Question先考虑一个结论,\(x\)为......
  • P9915 「RiOI-03」3-2 题解
    更好的阅读这是一道找规律的题目。因为我个人习惯,以下部分使用从\(1\)开始的下标讲述。首先我们以\(1\)来说:发现在第\(x\)行\(y\)列的连通块是可以直接连到第\(1\)列的,所以很容易可以得出\(1\)到\(y\)列的连通块数量是\(2^y-1\)。接着,我们考虑再后面的情况:......
  • 常见问题解决 --- pip SSLEOFError
    问题C:\Users\Administrator\Desktop>pipinstallscapy-ihttp://pypi.douban.com/simple--trusted-hostpypi.douban.comLookinginindexes:http://pypi.douban.com/simpleWARNING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None......
  • 【题解】CQOI2017 - 小 Q 的表格
    【题解】CQOI2017-小Q的表格https://www.luogu.com.cn/problem/P3700首先考虑题面给的两个式子。由式二可以得到:\[\dfrac{f(a,a+b)}{a(a+b)}=\dfrac{f(a,b)}{ab}\]发现这个很像辗转相除,可得\[\dfrac{f(a,b)}{ab}=\dfrac{f(a,a\bmodb)}{a(a\bmodb)}\]然后由式一转换,最......