首页 > 其他分享 >[ARC125E] Snack 题解

[ARC125E] Snack 题解

时间:2023-04-29 09:11:21浏览次数:36  
标签:Snack lb int 题解 LL kN ARC125E include 糖果

不难发现一个较简单的网络流模型:

  • 源点向所有糖果 \(i\) 连 \(a_i\) 的容量;
  • 所有糖果向所有人 \(i\) 连 \(b_i\) 的容量;
  • 所有人 \(i\) 向汇点连 \(c_i\) 的容量。

但第二步中建出的边数达到了惊人的 \(O(nm)\),显然过不去。

考虑优化。从最大流角度优化较困难,由于最大流等价于最小割,我们可以从最小割的角度进行优化。

考虑先枚举源点到每个糖果的边是否断掉,设保留了 \(l\) 个糖果。那么每个人都有两种决策:把到 \(l\) 个糖果的边全部断掉,或是断掉到汇点的边,代价是 \(\min(lb_i,c_i)\)。

发现这个决策与具体选了哪些糖果无关,故我们可以先把不保留代价大的糖果保留,即按 \(a_i\) 降序排序,依次选糖果。观察第 \(i\) 个人的代价 \(\min(lb_i,c_i)\),由于 \(l\) 是递增的,所以必定存在某个时刻 \(k_i\),使得 \(k_ib_i>c_i\) 且 \((k_i-1)b_i\le c_i\),即在 \(k_i\) 之前第 \(i\) 个人的决策是 \(lb_i\),但到 \(k_i\) 之后第 \(i\) 个人的决策就变成了 \(c_i\)。把人按 \(k_i\) 升序排序,于是所有人决策总变化量是 \(O(n)\) 的,双指针即可。

#include <numeric>
#include <iostream>
#include <algorithm>

using namespace std;
using LL = long long;

const int kN = 2e5 + 1;

int n, m, b[kN], d[kN];
LL a[kN], c[kN], k[kN], ans;

int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
  }
  for (int i = 1; i <= m; ++i) {
    cin >> b[i];
  }
  for (int i = 1; i <= m; ++i) {
    cin >> c[i];
    k[i] = c[i] / b[i] + 1;
    d[i] = i;
  }
  sort(a + 1, a + n + 1, greater<LL>());
  sort(d + 1, d + m + 1, [](int i, int j) { return k[i] < k[j]; });
  LL s = accumulate(a + 1, a + n + 1, 0LL), vc = 0, bs = accumulate(b + 1, b + m + 1, 0LL);
  ans = s;
  for (int i = 1, j = 1; i <= n; ++i) {
    s -= a[i], vc += bs;
    for (; j <= m && k[d[j]] <= i; ++j) {
      vc -= 1LL * i * b[d[j]] - c[d[j]], bs -= b[d[j]];
    }
    ans = min(ans, s + vc);
  }
  cout << ans;
  return 0;
}

标签:Snack,lb,int,题解,LL,kN,ARC125E,include,糖果
From: https://www.cnblogs.com/bykem/p/17363562.html

相关文章

  • P4423 题解
    前言题目传送门!更好的阅读体验?刚学分治就来写篇题解纪念一下,其实和平面最近点对一样的(总共四倍经验!)。思路根据P7883的分治思路,这题我们可以考虑用相似的方法解决。首先将点集按\(x\)坐标从小到大排序。然后分治。对于\(\left[l,r\right]\)区间,分治为\(\left[l,mid......
  • 题解 P3225 [HNOI2012] 矿场搭建
    解析传送门一道简单的tarjan题题意:在无向图中找一些点,这些点组成的的点集记为\(V\),使得去掉任意一个点,剩下的每一个点都可以到达\(V\)中任意一个点,求点集\(V\)的大小的最小值及其方案数。去掉一个点,很自然的联想到割点,那么考虑一下割点在不在备选集合中。如图,显然可以看出,......
  • Codeforces Round 868 (Div. 2) A-E题解
    比赛地址这把真不在状态,麻了,看来还得再练A.A-characteristic题意:给出n和k,要求构造只含1和-1数组a,存在k对(i,j)(i≠j),有a[i]*a[j]=1Solution令构造的数组有x个1和y个-1,那么其对于答案的贡献有\[x*(x-1)/2+y*(y-1)/2\]又因为有x+y=n,所以可以转化成关于x的一元二次方程化简后......
  • COMPSCI 589 问题解答
    COMPSCI589Homework4-Spring2023DueMay6,2023,11:55pmEasternTime1InstructionsThishomeworkassignmentconsistsofaprogrammingportion.Whileyoumaydiscussproblemswithyourpeers,youmustanswerthequestionsonyourownandimplementall......
  • P4681 [THUSC2015]平方运算 题解
    题面链接简要题意给定一个序列,区间.map([](intx){x=x*x%p;});,区间求和。p给定,为小质数。\(N,M\le10^5\)。题解而把一个数看作一个点,向其平方取模连一条边,则最终必然构成一个基环森林,注意到\(P\)很小,每个数经过\(11\)次迭代之后就会进入环中。对于一个区间,如......
  • “makefile:425: *** 遗漏分隔符 。 停止。”问题解决
    在终端下输入make时出现“makefile:2:***遗漏分隔符。停止。”问题,原因是在编写makefile文件时:3:3.c        gcc-o33.cgcc前的是tab分隔符,不能用空格,否则会出现“makefile:2:***遗漏分隔符。停止。”提示。。。make中规定每一Shell命令之前的开头必须使用<t......
  • 题解(开始学知识点
    D.FrogTraveler1900dpgq!https://codeforces.com/contest/1602/problem/D题解:我们可以通过类似bfs的过程找到每个点的能到达的所需步数最小的点,完成更新,但每个点能被哪些点到达很难判断,故我们反过来考虑,如果我们能得到从n->0的最短跳跃次数,亦得解,而每个点下一步能到达的点容......
  • P1345 [USACO5.4]奶牛的电信Telecowmunication 题解
    一、题目描述:n个点,m条边,给定起点s和终点t,求最少删去几个点后,s和t不连通。注意,s和t不能删掉。1<=n<=100,1<=m<=600; 二、解题思路:刚刚学了最大费用流,知道最大流等于最小割。但此题割的不是边,是点。我们需要将将割点转化为割边。把一个点切成两半......
  • 【题解】P3185 [HNOI2007]分裂游戏
    P3185[HNOI2007]分裂游戏题目描述聪聪和睿睿最近迷上了一款叫做分裂的游戏。该游戏的规则是:共有\(n\)个瓶子,标号为\(0,1,\ldots,n-1\),第\(i\)个瓶子中装有\(p_i\)颗巧克力豆,两个人轮流取豆子,每一轮每人选择\(3\)个瓶子,标号为\(i,j,k\),并要保证\(i\ltj,j......
  • 【题解】P4363 [九省联考 2018] 一双木棋 chess
    原题链接题目描述菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束。落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋......