\(\mathcal{Description}\)

  Link.

  给定非负整数序列 \(\{l_n\},\{r_n\},\{b_n\},X\),求最小的 \(s\),使得存在非负整数序列 \(\{a_n\},\{c_n\}\),满足 \(a_i\le X\),\(\sum_{i=1}^na_i=s\),\(c_i\in[l_i,r_i]\),且

\[\sum_{i=1}^nc_i(a_i-b_i)\ge0
\]

  所有输入均 \(\le10^5\)。

\(\mathcal{Solution}\)

  显然二分 \(s\),仅需做到检测某个 \(s\) 是否合法。下令 \(w=\sum_{i=1}^nc_ia_i\)。

  假设 \(\{a_n\}\) 已经确定,那么所有满足 \(a_i\ge b_i\) 的 \(c_i=r_i\),其余 \(c_i=l_i\)。考虑初始时所有 \(a_i=0,c_i=l_i\),现在把 \(s\) 个 \(1\) 挨个加到一些 \(a_i\) 上。当 \(a_i<b_i\) 时,对 \(w\) 贡献 \(l_i\)(此时 \(c_i\) 仍取 \(l_i\));当 \(a_i=b_i\) 时,对 \(w\) 贡献由 \(l_i\) 转为 \(r_i\)(\(c_i\) 变成 \(r_i\));继续增加,对 \(w\) 贡献 \(r_i\)。最终仅需比较 \(w\) 和 \(\sum_{i=1}^nl_ib_i\) 的大小。

  所以问题抽象为:有 \(n\) 个分段函数 \(f_{1..n}(x)\),满足

\[f_i(x)=\begin{cases}l_ix&x\in[0,b_i]\cap\mathbb N\\
l_ib_i+r_i(x-b_i)&x\in(b_i,X]\cap\mathbb N
\end{cases}
\]

  仅需钦定 \(\{x_n\}\),使得 \(\sum_{i=1}^nf_i(x_i)\) 取最大。

  考虑贪心,不难证明:至多有一个 \(0<x_i<X\)。直接枚举哪一个 \(0<x_i<X\),贪心地选取最大的 \(f_i(X)\),即可 \(\mathcal O(n)\) 检测。最终复杂度 \(\mathcal O(n\log\sum_{i=1}^nb_i)\)。

\(\mathcal{Code}\)

/* Clearink */

#include <cstdio>
#include <algorithm> #define rep( i, l, r ) for ( int i = l, repEnd##i = r; i <= repEnd##i; ++i )
#define per( i, r, l ) for ( int i = r, repEnd##i = l; i >= repEnd##i; --i ) inline int rint () {
int x = 0, f = 1; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () ) f = s == '-' ? -f : f;
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x * f;
} typedef long long LL; const int MAXN = 1e5;
int n, x, b[MAXN + 5], l[MAXN + 5], r[MAXN + 5], ord[MAXN + 5];
LL full[MAXN + 5]; inline LL contr ( const int i, const int s ) {
return s <= b[i] ? 1ll * s * l[i]
: 1ll * l[i] * b[i] + 1ll * ( s - b[i] ) * r[i];
} inline void init () {
std::sort ( ord + 1, ord + n + 1, []( const int i, const int j ) {
return contr ( i, x ) > contr ( j, x );
} );
rep ( i, 1, n ) full[i] = full[i - 1] + contr ( ord[i], x );
} inline LL calc ( const LL scr ) {
/*
* let's come up with a greedy algorithm!
* */
int fcnt = scr / x, rest = scr % x;
LL ret = 0;
rep ( i, 1, n ) { // score on exam <ord[i]> is <rest>.
LL cur = contr ( ord[i], rest );
if ( i > fcnt ) cur += full[fcnt];
else cur += full[fcnt + 1] - contr ( ord[i], x );
ret = cur > ret ? cur : ret;
}
return ret;
} int main () {
n = rint (), x = rint ();
LL sum = 0, sb = 0;
rep ( i, 1, n ) {
ord[i] = i;
b[i] = rint (), l[i] = rint (), r[i] = rint ();
sum += 1ll * b[i] * l[i], sb += b[i];
}
init ();
LL lef = 0, rig = sb;
while ( lef < rig ) {
LL mid = lef + rig >> 1;
if ( calc ( mid ) >= sum ) rig = mid;
else lef = mid + 1;
}
printf ( "%lld\n", lef );
return 0;
}

Solution -「AGC 034C」Tests的更多相关文章

  1. Solution -「AGC 036D」「AT 5147」Negative Cycle

    \(\mathcal{Descriprtion}\)   Link.   在一个含 \(n\) 个结点的有向图中,存在边 \(\lang i,i+1,0\rang\),它们不能被删除:还有边 \(\l ...

  2. Solution -「AGC 016F」Games on DAG

    \(\mathcal{Description}\)   Link.   给定一个含 \(n\) 个点 \(m\) 条边的 DAG,有两枚初始在 1 号点和 2 号点的棋子.两人博弈,轮流移动其中一枚棋 ...

  3. Solution -「AGC 026D」Histogram Coloring

    \(\mathcal{Description}\)   Link.   有 \(n\) 列下底对齐的方格纸排成一行,第 \(i\) 列有 \(h_i\) 个方格.将每个方格染成黑色或白色,求使得任意完 ...

  4. Solution -「AGC 004E」「AT 2045」Salvage Robots

    \(\mathcal{Description}\)   Link.   有一个 \(n\times m\) 的网格.每个格子要么是空的,要么有一个机器人,要么是一个出口(仅有一个).每次可以命令所有机 ...

  5. Solution -「AGC 012F」「AT 2366」Prefix Median

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_{2n-1}\}\),将 \(\{a_{2n-1}\}\) 按任意顺序排列后,令序列 \(b_i\) 为前 ...

  6. Solution -「AGC 010C」「AT 2304」Cleaning

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个点的无根树,点有点权,每次选择两个不同的叶子,使它们间的简单路径的所有点权 \(-1\),问能否将所有点 ...

  7. Solution -「AGC 019E」「AT 2704」Shuffle and Swap

    \(\mathcal{Description}\)   Link.   给定 \(01\) 序列 \(\{A_n\}\) 和 \(\{B_n\}\),其中 \(1\) 的个数均为 \(k\).记 \( ...

  8. Solution -「AGC 019F」「AT 2705」Yes or No

    \(\mathcal{Description}\)   Link.   有 \(n+m\) 个问题,其中 \(n\) 个答案为 yes,\(m\) 个答案为 no.每次你需要回答一个问题,然后得知这个 ...

  9. Solution -「AGC 013E」「AT 2371」Placing Squares

    \(\mathcal{Description}\)   Link.   给定一个长度为 \(n\) 的木板,木板上有 \(m\) 个标记点,第 \(i\) 个标记点距离木板左端点的距离为 \(x_i\ ...

随机推荐

  1. js跨域请求解决方案

    什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 广义的跨域: 1.) 资源跳转: A链接.重定向.表单提交 2.) 资源嵌入: <link>.&l ...

  2. JS 判断上传文件类型

    var video_src_file = $("#video_src_file").val(); var fileTypes = new Array("flv" ...

  3. linux 三剑客(持续更新)排版后续再说,边学边记笔记

    切记:seq命令用于产生从某个数到另外一个数之间的所有整数.sed才是处理文本的命令 在遇到扩展符号时,需要添加特定参数,| () +[] 为扩展符号时,必须添加参数 egrep/grep -E  s ...

  4. python驱动SAP完成数据导出(二)

    在上一篇 python驱动SAP完成数据导出(一)中,我们提到了数据导出前,SAP布局的重要性,如何识别当前布局模式,以及如何切换到想要的布局.本篇小爬将着重讲讲数据导出的注意事项. 我们可以通过如下 ...

  5. JAVA之垃圾收集器

    概述 垃 圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计 ...

  6. 备忘录——基于rdlc报表实现打印产品标签

    目录 0. 背景说明 1. 条形码生成 2. 获取产品的小程序码 3. 报表设计器设计标签模版 3.1 为WinForm控件工具箱添加ReportViewer控件 3.2 为VS2019安装RDLC报 ...

  7. Solon Web 开发,七、视图模板与Mvc注解

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  8. Api自动生成

    如果经常对接api, 可以自己写一个自动化生成代码,提高效率 只抛出一个思路,暂不提供源码 使用json+字符串处理+生成文件 发送一个请求,返回字符串转换为 Newtonsoft.Json.Linq ...

  9. 【刷题-PAT】A1126 Eulerian Path (25 分)

    1126 Eulerian Path (25 分) In graph theory, an Eulerian path is a path in a graph which visits every ...

  10. opencv 4.0 + linux下静态编译,展示详细ccmake的参数配置

    #先安装 cmake 3.14 # cmake安装到了 /usr/local/bin #配置PATH export PATH="$PATH:/usr/local/bin" #下载最 ...