Solution -「多校联训」Sample
\(\mathcal{Description}\)
(稍作简化:)对于变量 \(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]\) 的限制,发现这是一个带约数的最优化问题:
\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\),就能化归为无约束的情况了。具体地,构造
\]
此时 \(g\) 被作为引入变量 \(\lambda\) 的系数,所以当 \(\frac{\partial L}{\partial \lambda}=0\) 时,自然有 \(g=0\)。这就是 Lagrange 乘子法。
回到本题,尝试直接解出 \(\lambda\),先表示所有 \(p\):
\Rightarrow p_i=\frac{\lambda+2i}{4i}.
\]
代入约束 \(g=0\) 中:
\Rightarrow \lambda=\frac{4-2n}{h_n}.
\]
其中 \(h_n\) 为调和级数前缀和。注意到直接代入 \(\lambda\) 可能时一段 \(p\) 的前缀 \(<0\),所以只好二分钦定一个前缀为 \(0\)。假设钦定 \(p_{1..t-1}=0\),类似地有
\]
代入 \(f_t\) 后简单化简有
\]
就能直接计算了。单次复杂度是二分的 \(\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的更多相关文章
- Solution -「多校联训」排水系统
\(\mathcal{Description}\) Link. 在 NOIP 2020 A 的基础上,每条边赋权值 \(a_i\),随机恰好一条边断掉,第 \(i\) 条段的概率正比于 \(a ...
- Solution -「多校联训」I Love Random
\(\mathcal{Description}\) 给定排列 \(\{p_n\}\),可以在其上进行若干次操作,每次选取 \([l,r]\),把其中所有元素变为原区间最小值,求能够得到的所有不同序 ...
- Solution -「多校联训」签到题
\(\mathcal{Description}\) Link. 给定二分图 \(G=(X\cup Y,E)\),求对于边的一个染色 \(f:E\rightarrow\{1,2,\dots,c\ ...
- Solution -「多校联训」朝鲜时蔬
\(\mathcal{Description}\) Link. 破案了,朝鲜时蔬 = 超现实树!(指写得像那什么一样的题面. 对于整数集 \(X\),定义其 好子集 为满足 \(Y\sub ...
- Solution -「多校联训」消失的运算符
\(\mathcal{Description}\) Link. 给定长度为 \(n\) 的合法表达式序列 \(s\),其中数字仅有一位正数,运算符仅有 - 作为占位.求将其中恰好 \(k\) ...
- Solution -「多校联训」假人
\(\mathcal{Description}\) Link. 一种物品有 长度 和 权值 两种属性,现给定 \(n\) 组物品,第 \(i\) 组有 \(k_i\) 个,分别为 \((1,a ...
- Solution -「多校联训」古老的序列问题
\(\mathcal{Description}\) Link. 给定序列 \(\{a_n\}\),和 \(q\) 次形如 \([L,R]\) 的询问,每次回答 \[\sum_{[l,r]\su ...
- Solution -「多校联训」光影交错
\(\mathcal{Description}\) Link. 一个游戏包含若干次卡牌抽取,每次以 \(p_l\) 的概率得到 \(+1\),\(p_d\) 的概率得到 \(-1\),否则得到 ...
- Solution -「多校联训」数学考试
\(\mathcal{Description}\) Link. 给定 \(n\) 个函数,第 \(i\) 个有 \(f_i(x)=a_ix^3+b_ix^2+cx_i+d~(x\in[l_i, ...
随机推荐
- 779. 第K个语法符号
<找规律> <递归> 题目描述 在第一行我们写上一个 0.接下来的每一行,将前一行中的0替换为01,1替换为10. 给定行数 N 和序数 K,返回第 N 行中第 K个字符.(K ...
- Genymotion模拟器配置与使用
1.https://www.genymotion.com网站注册模拟器账号,并按照指引激活账号 此过程中提示商业用还是个人使用,商业使用需要有注册码,个人使用不需要注册码,我选择的是个人使用. 2.激 ...
- 【解决了一个小问题】golang go.mod中多了一个斜杠导致replace无效
replace github.com/sxxx/common_lib/src/ => ../../common_lib/src 修改成 replace github.com/sxxx/commo ...
- vue学习6-if判断
<p v-if="weather=='sun'">去公园</p> <p v-else-if="weather=='s'&qu ...
- WPF学习笔记(四):AvalonEdit 代码高亮编辑控件专题
AvalonEdit 是一个基于 WPF 的文本编辑器组件.它是由 Daniel Grunwald 为 SharpDevelop 编写的.从 5.0 版开始,AvalonEdit 根据MIT许可证发布 ...
- DataTable 中文国际化
DataTable中文设置,详见代码 1 var table = $('#example').DataTable({ 2 "language": { 3 "process ...
- java-异常-编译时检测异常和运行时异常区别(throws和throw区别)
1 package p1.exception; 2 /* 3 * 对于角标是整数不存在,可以用角标越界表示, 4 * 对于负数为角标的情况,准备用负数角标异常来表示. 5 * 6 * 负数角标这种异常 ...
- WEB前端基础之SCC(字体颜色背景-盒子模型)
目录 一:伪元素选择器 1.首字调整>>>:也是一种文档布局的方式 2.在文本的前面通过css动态渲染文本>>>:特殊文本无法选中 3.在文本的后面通过css动态渲 ...
- PC端实用正版软件推荐
首先介绍一下背景,我本人是一个软件工程师,所以对电脑上很多软件使用都有要求,这里将个人觉得好用的一些软件分享给大家: 1. Typora 对于长写本地笔记.网络博客的人,对 MarkDown 格式应该 ...
- Iceberg学习日记(1) 定位两个线上Iceberg查不到文件的问题
前言 Iceberg是我们去年年底(2020)开始调研,目前上线了130多张表.主要用于流量日志清洗,数据报表,推荐特征基础数据.至今为也算是积累了一些使用及定位问题经验. 这篇文章会介绍两个线上Ic ...