\(\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. nuxt服务端渲染

    <template> <div class="page"> page is search <ul> <li v-for="(it ...

  2. python+selenium 元素定位--iframe

    1. 一般webdriver要操作页面元素需要在Top Window的状态下,如下: 2.当浏览器显示iframe时,用正常的元素定位是没有效果的,需要将页面装换到iframe下再对页面元素进行操作 ...

  3. kafka学习笔记(二)kafka的基本使用

    概述 第一篇随笔从消息队列的定义和各种应用,以及kafka的分类定义和基本知识,第二篇就写一篇关于kafka的基本实际配置和使用的随笔,包括kafka的集群参数的配置,生产者使用机制,消费者使用机制. ...

  4. Lucene8.5.x全文检索工具

    本文的资源展示: hotword:是热词的文本,比如不是词语的中文,但是是什么人名或者公司名称的词语,需要分词成一个词语的将需要的加入hotword.dic stopword:无意义的词放入的词典,或 ...

  5. python极简教程06:生成式和装饰器

    测试奇谭,BUG不见. 这一场,主讲python的生成式和装饰器. 目的:掌握四种生成式(列表.生成器.集合.字典),装饰器的原理和使用. 生成式 01 什么是生成式? 能够用一行代码,快速高效的生成 ...

  6. RHCSA 第五天

    1. a.创建普通变量local_data=1并访问 [root@sss ~]#local_data=1 [root@sss ~]#echo local_data local_data [root@s ...

  7. [C# 学习]窗体间调用控件

    一.方法1: 假如有两个窗体,Form_A和Form_B,每个窗体里都有一个按键,Button_A和Button_B,要实现单击Button_A显示窗体B,那么窗体A中Buttom_A的单击事件的程序 ...

  8. 【算法】KMP

    @ 目录 一. 暴力匹配 二.KMP的基本思想 三.next[]的求法 1. 暴力求解 2. 递推求解 四.KMP算法 一. 暴力匹配 字符串匹配的最直接的方法就是暴力匹配,而KMP算法也是基于暴力算 ...

  9. 【刷题-LeetCode】153 Find Minimum in Rotated Sorted Array

    Find Minimum in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some p ...

  10. DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ | TORCH.AUTOGRAD

    torch.autograd 是PyTorch的自动微分引擎,用以推动神经网络训练.在本节,你将会对autograd如何帮助神经网络训练的概念有所理解. 背景 神经网络(NNs)是在输入数据上执行的嵌 ...