首页 > 其他分享 >Solution - Atcoder ARC125E Snack

Solution - Atcoder ARC125E Snack

时间:2024-07-06 22:09:01浏览次数:8  
标签:Atcoder Snack limits int sum times ARC125E type operatorname

观察到这种都是数量上限的限制,且求 \(\max\)。

所以可以考虑网络流建模,而流量就对应着给的糖果数。
令 \(S\) 为源点,\(T\) 为汇点,编号为 \(1\sim n\) 的点对应的糖果的种类,编号为 \(n + 1\sim n + m\) 的点对应的小孩。
连边 \((S, i, a_i)\),表示第 \(i\) 种糖果数不超过 \(a_i\) 个。
连边 \((i, n + j, b_j)\),表示第 \(j\) 个小孩吃单种糖果不超过 \(b_j\) 个。
连边 \((n + j, T, c_j)\),表示第 \(j\) 个小孩总共不能吃超过 \(c_i\) 个糖果。

但是在 \(n, m\le 2\times 10^5\) 的情况下,跑最大流明显有点废。
考虑一个套路,根据最大流最小割定理有最大流 \(=\) 最小割,所以转而去求这个图的最小割。

考虑这个图的最小割怎么求。
首先令 \(\operatorname{type}_i = S \operatorname{or} T\),代表 \(i\) 点是属于 \(S\) 集合还是 \(T\) 集合。
能发现对于 \(\operatorname{type}_i\) 的分配方式,对应的割的大小就为 \((\sum\limits_{i = 1}^n a_i[\operatorname{type}_i = T]) + (\sum\limits_{j = 1}^m b_j[\operatorname{type}_{n + j} = T]\times \sum\limits_{i = 1}^n [\operatorname{type}_i = S]) + (\sum\limits_{j = 1}^m c_j[\operatorname{type}_{m + j} = S])\)。

发现对于 \(i, j\) 之间的贡献对于 \(i\) 这一方其实只有 \(\sum\limits_{i = 1}^n [\operatorname{type}_i = S]\)。

这启发考虑枚举这个 \(c = \sum\limits_{i = 1}^n [\operatorname{type}_i = S]\) 来做。

  • 对于 \(\sum\limits_{i = 1}^n a_i[\operatorname{type}_i = T]\)。
    易知这就是让最大的 \(c\) 个 \(a_i\) 对应的 \(\operatorname{type}\) 为 \(S\)。
  • 对于 \((\sum\limits_{j = 1}^m b_j[\operatorname{type}_{n + j} = T]\times c) + (\sum\limits_{j = 1}^m c_j[\operatorname{type}_{m + j} = S])\)。
    相当于就是求 \(\sum\limits_{j = 1}^m \min\{b_j\times c, c_j\}\)。
    这个可以知道 \(b_j\times c\le c_j\) 当且仅当 \(c\le \lfloor\frac{c_j}{b_j}\rfloor\),就可以 \(\mathcal{O}(1)\) 维护了。

时间复杂度 \(\mathcal{O}(n\log n)\),瓶颈在排序。

#include<bits/stdc++.h>
using ll = long long;
const int maxn = 2e5 + 10;
ll a[maxn], b[maxn], c[maxn];
std::vector<int> id[maxn];
int main() {
   int n, m; scanf("%d%d", &n, &m);
   for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
   for (int i = 1; i <= m; i++) scanf("%lld", &b[i]);
   for (int i = 1; i <= m; i++) scanf("%lld", &c[i]);
   for (int i = 1; i <= m; i++) {
      ll ti = c[i] / b[i] + 1ll;
      if (ti <= (ll)n) id[ti].push_back(i);
   }
   std::sort(a + 1, a + n + 1, [&](ll x, ll y) {return x > y;});
   ll sum = 0, add = 0, ans;
   for (int i = 1; i <= n; i++) sum += a[i];
   for (int i = 1; i <= m; i++) add += b[i];
   ans = sum;
   for (int i = 1; i <= n; i++) {
      sum -= a[i], sum += add;
      for (int j : id[i]) sum -= b[j] * i, add -= b[j], sum += c[j];
      ans = std::min(ans, sum);
   }
   printf("%lld\n", ans);
   return 0;
}

标签:Atcoder,Snack,limits,int,sum,times,ARC125E,type,operatorname
From: https://www.cnblogs.com/rizynvu/p/18287938

相关文章

  • AtCoder Beginner Contest 359
    AtCoderBeginnerContest359A-CountTakahashi有\(n\)个字符串,每个串要么是Takahashi要么是Aoki,问有多少个字符串是Takahashi额....这还要有题解吗(?)#include<iostream>#include<cstring>usingnamespacestd;intmain(){stringa;intn,ans=0;cin>......
  • Solution - Atcoder AGC010E Rearranging
    因为只有相邻的互质的\(a_i\)可以交换,那么就说明不互质的\(a_i\)无法相交换,对应的位置关系也就不会改变。于是可以考虑图论建模,对于\(\gcd(a_i,a_j)>1\),连边\((i,j)\)。那么对于先手,就相当于要把这些边定向,变为一个DAG。而后手因为要保证最大,所以肯定是在DAG上跑......
  • AtCoder Beginner Contest 359
    AtCoderBeginnerContest359这场我赛时打的非常不好,只做出了\(2\)题。A-CountTakahashi签到//Problem:A-CountTakahashi//Contest:AtCoder-UNIQUEVISIONProgrammingContest2024Summer(AtCoderBeginnerContest359)//URL:https://atcoder.jp/conte......
  • Solution - Atcoder AGC034F RNG and XOR
    考虑到这个边权是\(\oplus\),那么说明对于\((u,v)\),\(u\tov\)和\(v\tou\)的边权实质是相同的。那么对于\(0\tox\),就可以反过来,记录下对应的路径,从\(x\)开始走,那么第一次走到\(0\)的时候也就是从\(0\)第一次走到\(x\)的时候。于是就转化为了\(x\)为起点,第一次......
  • AtCoder Beginner Contest 043
    D-Unbalanced只需要找到形如\(XX\)、\(XYX\)的字串即可。即两个相同字符之间最多间隔一个字符。证明:若不然,\(AXYA\),每加一个字符\(A\),都要增加多余字符\(XY\),不可能符合要求。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios......
  • AtCoder Beginner Contest 042
    C-Iroha'sObsession用一个\(\rmst\)数组把每一位标记,然后枚举大于\(n\)的数,一旦有各位都满足要求的数出现就\(\rmbreak\)。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;boolst[10];boolcheck(intx){ while(x){ intb=x%1......
  • Atcoder ABC091D Two Sequences
    首先根据\(\operatorname{xor}\),就想到拆成二进制的\(a_{i,w},b_{i,w}\)来处理。类似竖式加法,考虑把得到的结果\(c_{w}\)分为\(a_{i,w}+b_{j,w}+x\),其中\(x\)就是上一位的进位。进一步的,发现对于总的\(c_{w}\),\(a_{i,w},b_{j,w}\)肯定都在这个位置加了\(......
  • Atcoder ARC090F Number of Digits
    记\(n\)为题面的\(S\)。能发现对于\(f(l)=8\),共有\(9\times10^7\)个数。此时就已经有\(8\times9\times10^7>10^8=n_{\max}\)了,就说明不存在\(f\ge8\)的情况,还满足这部分对应的数能全被选满。所以可以知道对于\(f(l)\ge8\)的情况,只存在\(f(r)-f(l)=......
  • AtCoder Beginner Contest 359 (A ~F)
    A-CountTakahashiQuestion:给你n个单词,要么是Takahashi,要么是Aoki;输出有几个Takahashi即可。Code:#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'#defineintlonglongtypedeflonglongll;typedefunsignedlonglongull;typedefpair<......
  • Atcoder ABC 360 全题解
    致歉对不起,我不应该在全题解的编写上咕咕咕两个月,导致流量大量流失。我知错了,下次还犯。AB无C考虑一个箱子里的所有球,我们需要把这些球放进互不相同的一些箱子里。然而我们可以留一个球在箱子里,显然留重量最大的最好,所以答案就是$\sum_{i=1}^{N}W_i$减去每个箱子里的最......