洛谷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方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
随机推荐
- Guava包学习-Cache
这段时间用到了ehcache和memcache,memcache只用来配置在tomcat中做负载均衡过程中的session共享,然后ehcache用来存放需要的程序中缓存. Guava中的Cache和 ...
- 【[IOI2014]Wall 砖墙】
好像随便一卡就最优解了 malao告诉我这道题挺不错的,于是就去写了写 这两个操作很有灵性啊,感觉这么有特点的数大概是需要分块维护的吧 但是并没有什么区间查询,只是在最后输出整个序列 于是我们就直接用 ...
- 【[SCOI2010]序列操作】
好颓啊,我竟然来写了一道恶心的板子 旁边的魏佬嘲讽我,还用欺负我 嘤嘤嘤 那就不膜魏佬了 嘤嘤嘤 这是一道无聊的板子 看到这些操作,我们看到这些操作就知道我们需要维护的东西了 首先那个最长的连续的\( ...
- 20165302实验二java面向对象程序设计
20165302实验二java面向对象程序设计 实验结果 提交点1 1.实验要求: 参考 (http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTE ...
- SVN篇
启动SVN : svnserve -d -r svn 查看进程: ps -ef | grep svmserve -------------------------------------------- ...
- Java利用 ganymed-ssh2-build.jar来上传文件到linux以及下载linux文件以及执行linux shell命令
package api; import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.IOExcepti ...
- 关于iPad上模态显示视图中的UITextField,UITextView在输入完成后无法回收键盘的问题解决。
在iPad开发过程中遇到一个问题,UITextField 存在由UIModalPresentationFormSheet 弹出的带导航条的视图控制器中时,调用 resignFirstResponder ...
- font-failmly字体对应
- Java中的类与对象
一.类与对象的概念 1.类:类是一组相同属性.方法的对象的集合:对象是类的具体化. 2.对象具有类所有的特征,类拥有的,对象就拥有. 3.类与对象他们的关系是相对的. 类有什么特点 1) 类是对象的类 ...
- 关于2018年第九届蓝桥杯[C++省赛B组][第四题:测试次数]的疑问
题目来源:https://blog.csdn.net/qq_34202873/article/details/79784548 #标题:测试次数#x星球的居民脾气不太好,但好在他们生气的时候唯一的异常 ...