\(\mathcal{Description}\)

  Link

  (稍作简化:)对于变量 \(p_{1..n}\),满足 \(p_i\in[0,1],~\sum p_i=1\) 时,求 \(\max \sum_{i=1}^n(p_i-p_i^2)i\)。

  数据组数 \(T\le10^5\),\(n\le10^6\)。

\(\mathcal{Solution}\)

  Lagrange 乘子法的板题,可惜我不会。(

  先忽略 \(p_i\in[0,1]\) 的限制,发现这是一个带约数的最优化问题:

\[\max~~~~f=\sum_{i=1}^n(p_i-p_i^2)i,\\
\operatorname{s.t.}~~~~g=\sum_{i=1}^np_i-1=0.
\]

考虑在无约束时,\(\forall i,~\frac{\partial f}{\partial p_i}=0\) 时能取到 \(f\) 的极值,本题由于偏导是一次式,仅有一个解,所以一定是最值。我们尝试将约束 \(g=0\) 变成 \(f\) 的一个维度,使得当 \(f'\) 关于 \(g\) 的偏导为 \(0\) 时恰有 \(g=0\),就能化归为无约束的情况了。具体地,构造

\[L=f+\lambda g
\]

此时 \(g\) 被作为引入变量 \(\lambda\) 的系数,所以当 \(\frac{\partial L}{\partial \lambda}=0\) 时,自然有 \(g=0\)。这就是 Lagrange 乘子法。

  回到本题,尝试直接解出 \(\lambda\),先表示所有 \(p\):

\[\frac{\partial L}{\partial p_i}=0=\lambda+2i-4ip_i\\
\Rightarrow p_i=\frac{\lambda+2i}{4i}.
\]

代入约束 \(g=0\) 中:

\[\sum_{i=1}^n\frac{\lambda+2i}{4i}-1=0\\
\Rightarrow \lambda=\frac{4-2n}{h_n}.
\]

其中 \(h_n\) 为调和级数前缀和。注意到直接代入 \(\lambda\) 可能时一段 \(p\) 的前缀 \(<0\),所以只好二分钦定一个前缀为 \(0\)。假设钦定 \(p_{1..t-1}=0\),类似地有

\[\lambda_t=\frac{4-2(n-t+1)}{h_n-h_{t-1}}.
\]

代入 \(f_t\) 后简单化简有

\[f_t=\frac{(n+t)(n-t+1)}{4}-\frac{\lambda^2}{8(h_n-h_{t-1})}.
\]

就能直接计算了。单次复杂度是二分的 \(\mathcal O(\log n)\)。可以通过单调滑动 \(t\) 值预处理做到 \(\mathcal O(n)-\mathcal O(1)\)。

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <cstdio>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) const int MAXN = 1e6;
double h[MAXN + 5]; inline double calc( const int n, const int t ) {
double c = n - t + 1, s = 0.5 * ( n + t ) * c,
lam = ( 4 - 2 * c ) / ( h[n] - h[t - 1] );
if ( ( lam + 2 * t ) / ( 4 * t ) < 0 ) return -1.;
return 0.5 * s - 0.125 * lam * lam * ( h[n] - h[t - 1] );
} int main() {
freopen( "sample.in", "r", stdin );
freopen( "sample.out", "w", stdout ); rep ( i, 1, MAXN ) h[i] = h[i - 1] + 1. / i; int T, n; scanf( "%d", &T );
while ( T-- ) {
scanf( "%d", &n ); int l = 1, r = n;
while ( l < r ) {
int mid = l + r >> 1;
if ( calc( n, mid ) != -1. ) r = mid;
else l = mid + 1;
}
printf( "%.12f\n", calc( n, l ) );
}
return 0;
}

Solution -「多校联训」Sample的更多相关文章

  1. Solution -「多校联训」排水系统

    \(\mathcal{Description}\)   Link.   在 NOIP 2020 A 的基础上,每条边赋权值 \(a_i\),随机恰好一条边断掉,第 \(i\) 条段的概率正比于 \(a ...

  2. Solution -「多校联训」I Love Random

    \(\mathcal{Description}\)   给定排列 \(\{p_n\}\),可以在其上进行若干次操作,每次选取 \([l,r]\),把其中所有元素变为原区间最小值,求能够得到的所有不同序 ...

  3. Solution -「多校联训」签到题

    \(\mathcal{Description}\)   Link.   给定二分图 \(G=(X\cup Y,E)\),求对于边的一个染色 \(f:E\rightarrow\{1,2,\dots,c\ ...

  4. Solution -「多校联训」朝鲜时蔬

    \(\mathcal{Description}\)   Link.   破案了,朝鲜时蔬 = 超现实树!(指写得像那什么一样的题面.   对于整数集 \(X\),定义其 好子集 为满足 \(Y\sub ...

  5. Solution -「多校联训」消失的运算符

    \(\mathcal{Description}\)   Link.   给定长度为 \(n\) 的合法表达式序列 \(s\),其中数字仅有一位正数,运算符仅有 - 作为占位.求将其中恰好 \(k\) ...

  6. Solution -「多校联训」假人

    \(\mathcal{Description}\)   Link.   一种物品有 长度 和 权值 两种属性,现给定 \(n\) 组物品,第 \(i\) 组有 \(k_i\) 个,分别为 \((1,a ...

  7. Solution -「多校联训」古老的序列问题

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),和 \(q\) 次形如 \([L,R]\) 的询问,每次回答 \[\sum_{[l,r]\su ...

  8. Solution -「多校联训」光影交错

    \(\mathcal{Description}\)   Link.   一个游戏包含若干次卡牌抽取,每次以 \(p_l\) 的概率得到 \(+1\),\(p_d\) 的概率得到 \(-1\),否则得到 ...

  9. Solution -「多校联训」数学考试

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个函数,第 \(i\) 个有 \(f_i(x)=a_ix^3+b_ix^2+cx_i+d~(x\in[l_i, ...

随机推荐

  1. PowerShell【For篇】

    1-10的循环 1 for($i=1;$i -le 10;$i++){ 2 $i 3 } 当然之前前一篇中所写到的1..9你也可以直接在ps中写道 1..10 运行结果也是一样的. 也可以这样 1 f ...

  2. ajax 异步 提交 含文件的表单

    1.前言 需求是使用 jquery 的 ajax 异步提交表单,当然,不是简单的数据,而是包含文件数据的表单.于是我想到了 new FormData() 的用法, 可是仍然提交失败,原来是ajax的属 ...

  3. 第10组 Alpha冲刺 (6/6)(组长)

    1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/14008187.html ·作业博客:https://edu.cnblogs.co ...

  4. Cache一致性协议与伪共享问题

    Cache一致性协议 在说伪共享问题之前,有必要聊一聊什么是Cache一致性协议 局部性原理 时间局部性:如果一个信息项正在被访问,那么在近期它很可能还会被再次访问 比如循环.方法的反复调用等 空间局 ...

  5. Windows 10 安装 Git 与初次运行前的配置

    Windows 10 安装 Git 与初次运行前的配置 在 Windows 上安装 初次运行 Git 前的配置 用户信息 文本编辑器 检查配置信息 获取 Git 仓库 在现有目录中初始化仓库 克隆现有 ...

  6. Ubuntu 桌面版使用总结

    最近拿出了大学时买的性(游)能(戏)本(机),其实从直观来看,硬件基础还是不错的,但是跑 WIN10, 清了各种广告,关了各种无效进城之后,用起来仍然还是很不爽.可能是已经用惯 mac 了吧,mac给 ...

  7. Solon 开发,三、构建一个Bean的三种方式

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  8. 从头造轮子:python3 asyncio之 gather (3)

    前言 书接上文:,本文造第三个轮子,也是asyncio包里面非常常用的一个函数gather 一.知识准备 ● 相对于前两个函数,gather的使用频率更高,因为它支持多个协程任务"同时&qu ...

  9. Linux中的一些基本命令

    文章目录 ls cd Linux的目录 文件的权限 1.用户,组,权限 2.文件的权限 文件的基本操作 增:创建文件 删:删除文件 改:修改文件 查:查看 vi/vim 是一个编辑工具,主要用来编辑文 ...

  10. 基于World Wind的数据可视化插件

    基于开源数据可视化类库(MSChart.VTK.D3)实现的组件样例,并基于World Wind实现调用上述组件的功能插件. GitHub下载地址:https://github.com/hujiuli ...