洛谷2612&&bzoj2817 [ZJOI2012]波浪
洛谷2612&&bzoj2817 [ZJOI2012]波浪
原题链接
题解
因为有abs不太好搞,考虑拆掉abs.
生成排列的方法之一:n个空位,从1到n一次插入一个空位。
这样搞的话考虑一个数的贡献
如果是233333 1 666666 |233333-1|+|1-666666|==233333+-1+666666-1 所以1的贡献为-2
如果是233333 inf 666666 |233333-inf|+|inf-666666|==inf-233333+inf-666666 所以inf的贡献为2inf
如果是1 2 3 |1-2|+|2-3|==2-1+3-2 所以2的贡献为0
也就是说一个数的贡献为这个数×(-sgn(左边的数-这个数)-sgn(右边的数-这个数))
(边界上的数可以看成这个数×(-sgn(相邻的数-这个数))
然后因为是从小到大插的,所以只要看这个数和多少已插入的数相邻
\(f[i][j][k][l]:已经插入了i个点,共j段连续,前面数的总贡献为(k-5000),边界共放了l个的方案数\)
k的话从0~10000,C++党没负下标只好这样了,P党无所谓
插入i分多种情况
- 插入在边界,且与一段相连,贡献为i
- 插入在边界,自成一段,贡献为-i
- 插入不在边界,与一段相连,贡献为0(因为一边放了一边没放)
- 插入不在边界,自成一段,贡献为-2i
- 插入不在边界,而且这次插入使得两段相连,贡献为2i
最后统计一下每种多少种情况即可。
不想会写高精,__float128大法好
k<=8用double
Code
// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
rg int x=0;rg char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x;
}
#define db __float128
int n,m,K;
namespace bigK{
db f[2][101][10001][3];
//f[a][b][c][d]
//塞了a个点,共b段,总贡献为(c-5000),边界共放了d个的方案数
#define F(a,b,c,d) (f[a][b][c+5000][d])
il vd out(db ans,int k){
int tot=ans;printf("%d.",tot);
while(k--){
ans=(ans-tot*1.0)*10.0;
if(!k)ans=ans+0.5;
tot=ans;printf("%d",tot);
}printf("\n");
}
il vd main(){
int now=0;
db ans=0,s1=1.0;
F(0,0,0,0)=1.00;
rep(i,2,min(n,20))F(0,0,0,0)/=i*s1;
db tot;
rep(i,1,n){
now^=1;memset(f[now],0,sizeof f[now]);
rep(j,0,i)rep(k,-5000,5000)rep(l,0,2){
tot=F(now^1,j,k,l);
if(tot==0)continue;
if(l^2){
if(j)F(now,j,k+i,l+1)+=tot*(2-l);//插入在边界 与一段相连
F(now,j+1,k-i,l+1)+=tot*(2-l);//插入在边界 自成一段
}
if(j)F(now,j,k,l)+=tot*(j*2-l);//插入不在边界 与一段相连
F(now,j+1,k-i*2,l)+=tot*(j+1-l);//插入不在边界 自成一段
if(j>1)F(now,j-1,k+i*2,l)+=tot*(j-1);//插入不在边界 这次插入使得两段相连
}
}
rep(i,m,5000)ans+=F(now,1,i,2)*s1;
rep(i,21,n)ans/=s1*i;
out(ans,K);
}
}
double g[2][101][10001][3];
il vd out(double ans,int k){
int tot=ans;printf("%d.",tot);
while(k--){
ans=(ans-tot*1.0)*10.0;
if(!k)ans=ans+0.5;
tot=ans;printf("%d",tot);
}printf("\n");
}
int main(){
#define Fname "wave"
freopen(Fname".in","r",stdin);
freopen(Fname".out","w",stdout);
n=gi(),m=gi(),K=gi();
if(K>8){bigK::main();}
#define G(a,b,c,d) g[a][b][c+5000][d]
else{
int now=0;
double ans=0,s1=1.0;
G(0,0,0,0)=1.00;
double tot;
rep(i,1,n){
now^=1;memset(g[now],0,sizeof g[now]);
rep(j,0,i)rep(k,-5000,5000)rep(l,0,2){
tot=G(now^1,j,k,l);
if(tot==0)continue;
if(l^2){
if(j)G(now,j,k+i,l+1)+=tot*(2-l);//插入在边界 与一段相连
G(now,j+1,k-i,l+1)+=tot*(2-l);//插入在边界 自成一段
}
if(j)G(now,j,k,l)+=tot*(j*2-l);//插入不在边界 与一段相连
G(now,j+1,k-i*2,l)+=tot*(j+1-l);//插入不在边界 自成一段
if(j>1)G(now,j-1,k+i*2,l)+=tot*(j-1);//插入不在边界 这次插入使得两段相连
}
}
rep(i,m,5000)ans+=G(now,1,i,2)*s1;
rep(i,1,n)ans/=s1*i;
out(ans,K);
}
return 0;
}
洛谷2612&&bzoj2817 [ZJOI2012]波浪的更多相关文章
- 题解 洛谷 P2612 【[ZJOI2012]波浪】DP+高精
题目描述 题目传送门 分析 因为有绝对值不好处理,所以我们强制从小到大填数 设 \(f[i][j][p][o]\) 为当前填到了第 \(i\) 个数,波动强度为 \(j\),有 \(p\) 个连续段并 ...
- bzoj2817[ZJOI2012]波浪
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2817 波浪 [问题描述] 阿米巴和小强是好朋友. 阿米巴和小强在大海旁边看海水的波涛.小 ...
- 【洛谷 P2597】 [ZJOI2012]灾难(LCA)
题目链接 考虑建一棵树,使一个生物灭绝时他的子树都会灭绝,显然这样答案就是以每个点为根的子树大小-1. 为什么原图不是一棵树,因为一个生物可能会以多个生物为食,所以按拓扑序来建树,把每个遍历到的点的父 ...
- [洛谷P2597] [ZJOI2012]灾难
洛谷题目链接:[ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引 ...
- [洛谷P2610] [ZJOI2012]旅游
洛谷题目链接:[ZJOI2012]旅游 题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个 ...
- 【BZOJ2817】[ZJOI2012]波浪(动态规划)
[BZOJ2817][ZJOI2012]波浪(动态规划) 题面 BZOJ 洛谷 题解 首先这个差值最大也就是\(n^2\)级别的. 那么这样子就可以压进状态啦. 我们把这个操作看成一个个加数的操作,按 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
随机推荐
- z-index终结者
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wangshuxuncom/article/details/30280627 z-in ...
- Java HttpURLConnection模拟请求Rest接口解决中文乱码问题
转自:http://blog.csdn.net/hwj3747/article/details/53635539 在Java使用HttpURLConnection请求rest接口的时候出现了POST请 ...
- 5、Web Service-整合CXF
1.工程准备 继续使用之前的服务端:https://www.cnblogs.com/Mrchengs/p/10562458.html 2.jar准备 前去apache官网下载响应的jar:http:/ ...
- 34、springboot的热部署
热部署 在开发中我们修改一个Java文件后想看到效果不得不重启应用,这导致大量时间花费, 我们希望不重启应用的情况下,程序可以自动部署(热部署).有以下四种情况,如何能实现热部署. 1.模板引擎 在S ...
- PAT——1043. 输出PATest
给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按“PATestPATest....”这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已 ...
- 多线程简单案例 - join( ) -lock()
join() 在调用结束前,主线程不会结束 不加的话,主线程会在子线程结束前继续执行:加了join(),主线程会等待子线程结束后在继续执行下去 #python3 #main print number ...
- nRF5 SDK for Mesh(一) 介绍和下载源码
一: 官网介绍地址:http://www.nordicsemi.com/Products/Bluetooth-low-energy/nRF5-SDK-for-Mesh Nordic offers a ...
- c++类模板分文件编写存在的问题
c++分文件编写的编译机制: 各个文件独立编译,如果在某.cpp文件中出现了函数调用,但是在此.cpp文件并没有对应函数的实现.此时就会在函数调用出生成特定的符号,在之后的链接过程完成函数调用. C+ ...
- spring定时任务注解@Scheduled的记录
spring 定时任务@Scheduled 转自https://www.cnblogs.com/0201zcr/p/5995779.html 1.配置文件 <?xml version=" ...
- laravel Eloquent ORM联合查询出现Class not found,就算在Moel中存在这个类
今天发现一个坑,在处理Eloquent ORM的联合查询时,一直报错Class 'AdminGroup' not found ,可是我的项目中明明存在这个类,如下 这是我的模型类: 它们的控制器方法: ...