首页 > 其他分享 >[AGC044E] Random Pawn

[AGC044E] Random Pawn

时间:2023-08-11 13:33:43浏览次数:54  
标签:frac Pawn int Random db MAXN AGC044E wz

AGC044E
首先列出基本的转移式,设 \(f_i\) 为从 i 出发期望的最大收益。
则 \(f_i=\max(a_i,\frac{f_{i-1}+f_{i+1}}{2}-b_i)\)。
不难看出 a 最大的点的期望值一定是 a,因为不可能花费 b 去获得 a 更小的值。
把这个点记为 \(a_0\)。
考虑如何去掉常数。
我们设 \(g_i=f_i+d_i\),则原式变为 \(g_i=(\max{a_i+d_i,\frac{g_{i-1}+g_{i+1}}{2}}-\frac{d_{i-1}+d_{i+1}}{2}-b_i+d_i)\)
那么 d 就可以递推出来。
设 \(c_i=a_i+d_i\)
则原式变为 \(g_i=\max(c_i,\frac{g_{i-1}+g_{i+1}}{2})\)
\(g_0=c_0,g_n=c_n\)
然后就比较精彩了,我们发现 g 的值可以表示为相邻两个点的中点的 y 值。
先不考虑 c 我们可以发现 g 是单减的直线。
加上 c 后,不难发现有贡献的 c 是一个上凸壳,因为 \(\frac{c_{i-1}+c_{i+1}}{2}>c_{i}\)
又因为上面提到的中点,新的 g 值就是这个凸壳。
直接维护即可。
code:

#include<cstdio>
#include<iostream>
using namespace std;
#define db double
const int MAXN=2e5+5;
const db eps=1e-12;
db xj(db A,db B,db C,db D){
;	return A*D-B*C;	
}
int n,q[MAXN],wz,ta,a1[MAXN];
db a[MAXN],b[MAXN],d[MAXN],dp[MAXN],c[MAXN],ma,Ans;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lf",&a[i]);
		if(a[i]>ma){
			ma=a[i];wz=i;
		}
	}
	for(int i=wz;i<=n;i++){
		a1[i-wz]=i;
	}
	for(int i=1;i<wz;i++){
		a1[n-wz+i]=i;
	}
	a1[n]=a1[0];
	for(int i=1;i<=n;i++) scanf("%lf",&b[i]);
	d[0]=0;d[1]=0;
	for(int i=1;i<n;i++){
		d[i+1]=2*(d[i]-b[a1[i]])-d[i-1];
	}
	q[0]=0;
	for(int i=0;i<=n;i++) c[i]=a[a1[i]]+d[i];
	for(int i=1;i<=n;i++){
		while(ta&&-xj(i-q[ta],c[i]-c[q[ta]],i-q[ta-1],c[i]-c[q[ta-1]])>eps) ta--;
		q[++ta]=i;
	}
	for(int i=0;i<ta;i++){
		db k=(c[q[i+1]]-c[q[i]])/(q[i+1]-q[i]),b=c[q[i]]-k*q[i];
		for(int j=q[i];j<q[i+1];j++) dp[j]=k*j+b;
	}
	for(int i=0;i<n;i++) Ans+=dp[i]-d[i];
	printf("%.10lf",Ans/n);
	return 0;
} 

标签:frac,Pawn,int,Random,db,MAXN,AGC044E,wz
From: https://www.cnblogs.com/StranGePants/p/17622650.html

相关文章

  • 软件测试|Python random模块,超乎想象的强大
    Python的random模块是一个非常强大的工具,用于生成随机数和随机选择。它提供了许多函数和方法,可以满足各种随机化需求。本文将介绍random模块的基本功能和常见用法,以帮助读者更好地理解和利用这个模块。返回整数random.randange()语法如下:random.randrange(stop)random.randrange(s......
  • Random Walk Problem
    Notice:ThisarticleisjustashortdiscussiononRandomWalkproblem,Icompute\(E(X^2)\)inthisarticle.AfterIreadsomematerials,fromaprogrammer'sperspective,IhavefoundthatthisproblemisnotjustsimpleasIthink,andit's......
  • 20 re/collection/time/random模块
    re模块补充说明importreret=re.findall('a(b)c','abcabcabcabc')#优先显示括号内东西print(ret)#['b','b','b','b']ret=re.findall('a(?:b)c','abcabcabcabc')#?:表示忽视括号print(r......
  • 条件随机场(conditional random field,CRF)模型初探
    条件随机场(conditionalrandomfield,CRF)模型初探1.条件随机场,一种特殊的概率图模型结构我们知道,从图结构角度来说,概率图模型可以分为以下两种:基于有向图的贝叶斯网:具备有向依赖性基于无向图的马尔科夫网:具备无向依赖性条件随机场是一个在变量子集上存在有......
  • UUID类randomUUID()方法
    1、randomUUID()方法用于返回类型4UUID,它由伪随机数生成器构造//uuid文件名通用唯一识别码Stringuuid=UUID.randomUUID().toString(); ......
  • 羊 老虎 饲养员 animal=random.choice([Tiger,Sheep]) 该animal类型是对象
    #羊老虎饲养员importrandom#基类classAnimal():#属性def__init__(self,animal,w,call,food,room_num):self._animal=animalself._w=wself._call=callself._food=foodself._room_num=room_num#动作......
  • pandoc: pdflatex: createProcess: posix_spawnp: illegal operation
    RuntimeError:Pandocdiedwithexitcode"1"duringconversion:pandoc:pdflatex:createProcess:posix_spawnp:illegaloperation(Inappropriateioctlfordevice)报错原因这个报错原因可能是由于Pandoc在进行转换时尝试调用pdflatex命令时出错。在某些PDF转换过......
  • 【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | LCG 线性同余算法 | 马特赛特旋转算
    ......
  • Python随机函数random使用详解
    在python中用于生成随机数的模块是random,在使用前需要import,下面看下它的用法。random.randomrandom.random()用于生成一个0到1的随机符点数:0<=n<1.0注意: 以下代码在Python3.5下测试通过,python2版本可稍加修改描述random()方法返回随机生成的一个实数,它在(0,1)范围内。......
  • pytorch使用(四)np.random.randint用法
    np.random.randint用法np.random.randint是numpy库中用于生成随机整数的函数。它的用法如下:numpy.random.randint(low,high=None,size=None,dtype='l')其中,各个参数的含义如下:low:生成的随机整数的下限(包含)。high:生成的随机整数的上限(不包含)。如果不提供high参数,则生......