洛谷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]波浪的更多相关文章

  1. 题解 洛谷 P2612 【[ZJOI2012]波浪】DP+高精

    题目描述 题目传送门 分析 因为有绝对值不好处理,所以我们强制从小到大填数 设 \(f[i][j][p][o]\) 为当前填到了第 \(i\) 个数,波动强度为 \(j\),有 \(p\) 个连续段并 ...

  2. bzoj2817[ZJOI2012]波浪

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2817 波浪 [问题描述] 阿米巴和小强是好朋友. 阿米巴和小强在大海旁边看海水的波涛.小 ...

  3. 【洛谷 P2597】 [ZJOI2012]灾难(LCA)

    题目链接 考虑建一棵树,使一个生物灭绝时他的子树都会灭绝,显然这样答案就是以每个点为根的子树大小-1. 为什么原图不是一棵树,因为一个生物可能会以多个生物为食,所以按拓扑序来建树,把每个遍历到的点的父 ...

  4. [洛谷P2597] [ZJOI2012]灾难

    洛谷题目链接:[ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引 ...

  5. [洛谷P2610] [ZJOI2012]旅游

    洛谷题目链接:[ZJOI2012]旅游 题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个 ...

  6. 【BZOJ2817】[ZJOI2012]波浪(动态规划)

    [BZOJ2817][ZJOI2012]波浪(动态规划) 题面 BZOJ 洛谷 题解 首先这个差值最大也就是\(n^2\)级别的. 那么这样子就可以压进状态啦. 我们把这个操作看成一个个加数的操作,按 ...

  7. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  8. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  9. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

随机推荐

  1. gluoncv 导入方式

    了解了sys.path和python 的import 的话,之前修改gluoncv 的方式就可以有了新的简单的方法: 如果你pip install gluoncv的,然后脚本又git clone了,发 ...

  2. 【jQuery mobile】启程跨平台开发之旅

    APICloud创建跨平台应用有两种方法,一种在云端直接创建,一种是在APICloud Studio中创建. 创建一个应用 1.注册账号 2.创建HelloApp应用 3.留意应用的ID . 4.下载 ...

  3. 3、RabbitMQ-work queues 工作队列

    work queues 工作队列 1.模型图: 为什么会出现 work queues? 前提:使用 simple 队列的时候 我们应用程序在是使用消息系统的时候,一般生产者 P 生产消息是毫不费力的( ...

  4. Kali-linux分析密码

    在实现密码破解之前,介绍一下如何分析密码.分析密码的目的是,通过从目标系统.组织中收集信息来获得一个较小的密码字典.本节将介绍使用Ettercap工具或MSFCONSOLE来分析密码. 8.2.1 E ...

  5. [转载] MySQL 注入攻击与防御

    MySQL 注入攻击与防御 2017-04-21 16:19:3454921次阅读0     作者:rootclay 预估稿费:500RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页 ...

  6. form组件-字段

    Form类 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML 1.Django内置字段如下: Field required=True, 是否 ...

  7. activemq的高级特性:消息的可靠性

    高级特性之消息的可靠性 可靠性分为:生产者.消费者.生产者必须让mq收到消息,消费者必须能够接收到消息并且消费成功,这就是消息的可靠性. 1:生产者可靠性 Session session = conn ...

  8. centos6.9下安装python3.7

    说明 以下所有操作都基于centos6.9 python3.7依赖openssl1.0.2,首先更新系统自带的openssl 建议 升级系统到centos7(系统openssl已升级到1.0.2) 升 ...

  9. Spark RDD理解

    目录 ----RDD简介 ----RDD操作类别 ----RDD分区 ----宽依赖和窄依赖作用 ----RDD分区划分器 ----RDD到调度 返回顶部 RDD简介 RDD是弹性分布式数据集(Res ...

  10. Python学习——编程语言介绍

    开发语言 高级语言:基于C/汇编等封装的语言,如Python.Java.C#.PHP.Go.ruby.C++……生成字节码让C/汇编去识别 低级语言:直接让计算机底层能识别成机器码的语言(计算机再将机 ...