\(\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. Linux上天之路(十五)之文件查找

    主要内容 精确查找 模糊查找 1. 精确查找 find - search for files in a directory hierarchy 递归地在层次目录中处理文件 查找方式: 按文件属性查找 ...

  2. JWT原理及实现

    wt(JSON Web Tokens),是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明.目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项目. 1. jwt认证流 ...

  3. Layui table 学习笔记

    templet:'<div>{{createrFormat(d.accounts.name)}}</div>' function createrFormat(o){ retur ...

  4. 【爬虫】将 Scrapy 部署到 k8s

    一. 概述 因为学习了 docker 和 k8s ,不管什么项目都想使用容器化部署,一个最主要的原因是,使用容器化部署是真的方便.上一篇文章 [爬虫]从零开始使用 Scrapy 介绍了如何使用 scr ...

  5. python极简教程07:封装、多态和继承

    测试奇谭,BUG不见. 这一场主讲python的面向对象部分--封装.多态和继承. 目的:掌握Python面向对象的三个核心概念. 封装 01 什么是封装? 封装的目的是,保护隐私.通俗的讲:不想让别 ...

  6. 毫米转像素dpi

    public static double MillimeterToPixel_X(double length) //length是毫米,1厘米=10毫米 { System.Windows.Forms. ...

  7. (2)用Micropython将ESP32数据上云

    之前我们尝试过直接把LED点亮并且闪烁. 今天尝试一下将LED的开关状态上云,并可以通过云来进行数据下发. 数据要上云,首先开发板要联网. 首先我们会用 Python的network 库, 在netw ...

  8. 【小记录】解决链接libcufft_static.a库出现的错误

    程序中使用了 cv::cuda::dft() 函数,需要在链接的时候使用libcufft_static.a这个库.链接出现大量类似错误:error: undefined reference to __ ...

  9. manjaro20默认关闭蓝牙

    用于节电. https://gist.github.com/0xfe11/d0874b7d31cf649616fa9d816571ab3c 推荐执行 # Stop and disable the bl ...

  10. mate10碎屏机当成小电脑使用尝试

    1.屏碎了修起来300-400,自己动手至少也要260以上买个屏幕钱. 手机图案锁屏也不知道密码,给我手机的亲戚忘了.当年手机被车压弯了. 对着恢复教程,盲屏幕猜着按还原了. 2.之后一路从8代系统更 ...