洛谷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方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
随机推荐
- gluoncv 导入方式
了解了sys.path和python 的import 的话,之前修改gluoncv 的方式就可以有了新的简单的方法: 如果你pip install gluoncv的,然后脚本又git clone了,发 ...
- 【jQuery mobile】启程跨平台开发之旅
APICloud创建跨平台应用有两种方法,一种在云端直接创建,一种是在APICloud Studio中创建. 创建一个应用 1.注册账号 2.创建HelloApp应用 3.留意应用的ID . 4.下载 ...
- 3、RabbitMQ-work queues 工作队列
work queues 工作队列 1.模型图: 为什么会出现 work queues? 前提:使用 simple 队列的时候 我们应用程序在是使用消息系统的时候,一般生产者 P 生产消息是毫不费力的( ...
- Kali-linux分析密码
在实现密码破解之前,介绍一下如何分析密码.分析密码的目的是,通过从目标系统.组织中收集信息来获得一个较小的密码字典.本节将介绍使用Ettercap工具或MSFCONSOLE来分析密码. 8.2.1 E ...
- [转载] MySQL 注入攻击与防御
MySQL 注入攻击与防御 2017-04-21 16:19:3454921次阅读0 作者:rootclay 预估稿费:500RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页 ...
- form组件-字段
Form类 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML 1.Django内置字段如下: Field required=True, 是否 ...
- activemq的高级特性:消息的可靠性
高级特性之消息的可靠性 可靠性分为:生产者.消费者.生产者必须让mq收到消息,消费者必须能够接收到消息并且消费成功,这就是消息的可靠性. 1:生产者可靠性 Session session = conn ...
- centos6.9下安装python3.7
说明 以下所有操作都基于centos6.9 python3.7依赖openssl1.0.2,首先更新系统自带的openssl 建议 升级系统到centos7(系统openssl已升级到1.0.2) 升 ...
- Spark RDD理解
目录 ----RDD简介 ----RDD操作类别 ----RDD分区 ----宽依赖和窄依赖作用 ----RDD分区划分器 ----RDD到调度 返回顶部 RDD简介 RDD是弹性分布式数据集(Res ...
- Python学习——编程语言介绍
开发语言 高级语言:基于C/汇编等封装的语言,如Python.Java.C#.PHP.Go.ruby.C++……生成字节码让C/汇编去识别 低级语言:直接让计算机底层能识别成机器码的语言(计算机再将机 ...