\(\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. JAVA SOCKET 详解

    概述 本人在开发学习NETTY的过程中,需要了解很多的网络开发知识,在此我总结一些关于socket的基础知识,大部分是网络总结,在此篇的随笔中记录socket的知识,以便于记录,如有问题欢迎大家斧正. ...

  2. 代码审计入门之BlueCMS v1.6 sp1

    0x00 前言 作为一名代码审计的新手,网上的大佬们说代码审计入门的话BlueCMS比较好,所以我就拿BlueCMS练练.(本人实在是一枚新手,请大佬们多多赐教) 0x01 环境准备 Phpstudy ...

  3. java基础04-数据类型扩展及面试题

    java基础04-数据类型扩展及面试题讲解 public class demo02 { public static void main(String[] args){ // 一.整数拓展: 进制 二进 ...

  4. 【Java】GUI编程

    GUI编程 前言 某koukou老师的任务罢了,好在狂神老师居然有GUI的课,只能说是有救星了. [狂神说Java]GUI编程入门到游戏实战 最好笑的是,老师要求掌握的居然是14年的知识,就连狂神在上 ...

  5. winform GDI+ 抗锯齿

    graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

  6. [Anti-AV] 从攻防对抗辩证性分析jsp免杀(一)

    从攻防对抗辩证性分析jsp免杀 从最早的最朴素木马 <%@ page import="java.io.InputStream" %> <%@ page impor ...

  7. golang中bufio和ioutil的使用

    bufio bufio包实现了带缓冲区的读写,是对文件读写的封装 bufio缓冲写数据 模式 含义 os.O_WRONLY 只写 os.O_CREATE 创建文件 os.O_RDONLY 只读 os. ...

  8. Ubuntu SVN 搭建

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion ...

  9. 『无为则无心』Python函数 — 35、Python中的闭包

    目录 1.闭包的概念 2.实现一个闭包 3.在闭包中外函数把临时变量绑定给内函数 4.闭包中内函数修改外函数局部变量 5.注意: 6.练习: 1.闭包的概念 请大家跟我理解一下,如果在一个函数的内部定 ...

  10. Mongodb全备+增备+oplog恢复误删数据

    此时测试表中有7条数据,做个全备. 全备: mongodump --host=192.168.43.43 --port=37017 --oplog --out=/opt/mongo/fullbacku ...