洛谷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. 3669. [NOI2014]魔法森林【LCT 或 SPFA动态加边】

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  2. flask开启debug模式的两种方法、加载配置文件的两种方法、URL传参的四种方法

    from flask import Flask app = Flask(__name__) # app.config.update(DEBUG=True)#开启debug模式 #加载配置文件方法一 # ...

  3. ionic和angularjs的区别?

    a.ionic是一个用来开发混合手机应用的,开源的,免费的代码库.可以优化HTML.css和js的性能,构建高效的应用程序,而且还可以用于构建sass和angularJS的优化 b.AngularJS ...

  4. 《metasploit渗透测试魔鬼训练营》学习笔记第六章--客户端渗透

    四.客户端攻击      客户端攻击与服务端攻击有个显著不同的标识,就是攻击者向用户主机发送的恶意数据不会直接导致用户系统中的服务进程溢出,而是需要结合一些社会工程学技巧,诱使客户端用户去访问这些恶意 ...

  5. oracle11g之Oracle体系结构(理论基础知识)

    第二章 oracle的体系结构 一.oracle体系结构概述1.实例和数据库组成完整的Oracle数据库系统数据库:一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等)实例:一组oracl ...

  6. HDU 1198 Farm Irrigation(并查集,自己构造连通条件或者dfs)

    Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  7. Project Euler:Problem 86 Cuboid route

    A spider, S, sits in one corner of a cuboid room, measuring 6 by 5 by 3, and a fly, F, sits in the o ...

  8. Spring Boot与Mybatis 借助Fastjson快速完成数据解析入库

    通过Spring Boot可以快速搭建一个项目结构,在此基础上本文就通过一个简单的例子,说明如何结合Mybatis 和 Fastjson,快速的完成一个数据的入库基本操作. 添加相关的依赖 <d ...

  9. JS知识点整理(二)

    前言 这是对平时的一些读书笔记和理解进行整理的第二部分,第一部分请前往:JS知识点整理(一).本文包含一些易混淆.遗漏的知识点,也会配上一些例子,也许不是很完整,也许还会有点杂,但也许会有你需要的,后 ...

  10. OC字符串处理

    接到一个需求, 现有多个品牌的商品,使用字符串保存已选中的品牌,使用','隔开,可以反选. 分析问题可知: 1. 字符串由多个品牌名字组成,由 ',' 隔开. 2.如果选中的品牌不在字符串内,则拼接到 ...