Luogu P2612 [ZJOI2012]波浪
题目
我们考虑从\(1\)到\(n\)把每个数放到序列里面去,以消掉绝对值。
在最后的序列中,如果\(i\)的某一边是序列的边界,那么\(i\)会产生\(0\)的贡献。如果\(i\)的某一边是一个比\(i\)小的数,那么\(i\)会产生\(i\)的贡献。如果\(i\)的某一边是一个比\(i\)大的数,那么\(i\)会产生\(-i\)的贡献。
当我们放\(i\)时,所有小于\(i\)的数都已经放进序列了,而大于\(i\)的还没放。
那么最后的序列中\(i\)的左右两边的情况就等同于放\(i\)的时候\(i\)两边是否紧贴着某个数。
所以我们可以把连通块(一个极大的连续的放了数的段)的情况和边界的情况放进dp的状态里。
设\(f_{i,j,k,l}\)表示放了\(i\)个数,序列中存在\(j\)个连通块,总贡献为\(k\)(这一维需要平移\(5000\)),有\(l\)个边界已经被紧贴(\(l=0,1,2\))的方案数。
发现第一维\(i\)显然是可以滚掉的。
那么有以下几个转移:
\(1.i\)一边是边界,一边是空:\(f_{j,k,l}(2-p)->f_{j+1,k-i,l+1}\)。
\(2.i\)一边是边界,一边是连通块:\(f_{j,k,l}(2-p)->f_{j,k+i,l+1}\)。
\(3.\)两边都是连通块:\(f_{j,k,l}(j-1)->f_{j-1,k+2i,l}\)。
\(4.\)两边都是空:\(f_{j,k,l}(j+1-l)->f_{j+1,k-2i,l}\)。
\(5.\)一边是连通块,一边是空:\(f_{j,k,l}(j*2-l)->f_{j,k,l}\)。
那么最后的答案就是\(\frac{\sum\limits_{i=5000+m}^{10000}f_{1,i,2}}{n!}\)。
注意要数据类型分治。
#include<bits/stdc++.h>
using namespace std;
const int N=107,M=10007;
namespace db{long double f[2][N][M][3];}
namespace flt{__float128 f[2][N][M][3];}
int min(int a,int b){return a<b? a:b;}
int n,m,k;
template<class T>void out(T ans)
{
cout<<"0.",ans*=10;
for(int i=1;i<=k;++i) cout<<(int)(ans+(k==i)*0.5),ans=(ans-(int)ans)*10;
}
template<class T>void solve(T f[][N][M][3])
{
T ans=0;
f[0][0][5000][0]=1;
int g=0,i,j,k,p;
for(i=1;i<=n;++i)
{
g^=1,memset(f[g],0,sizeof f[g]);
for(j=0;j<=min(i-1,m);++j)
for(k=0;k<=10000;++k)
for(p=0;p<=2;++p)
if(f[g^1][j][k][p])
{
if(k>=2*i) f[g][j+1][k-2*i][p]+=f[g^1][j][k][p]*(j+1-p);
if(j) f[g][j][k][p]+=f[g^1][j][k][p]*(j*2-p);
if(j>=2&&k+2*i<=10000) f[g][j-1][k+2*i][p]+=f[g^1][j][k][p]*(j-1);
if(p^2)
{
if(k>=i) f[g][j+1][k-i][p+1]+=f[g^1][j][k][p]*(2-p);
if(j&&k+i<=10000) f[g][j][k+i][p+1]+=f[g^1][j][k][p]*(2-p);
}
}
}
for(i=m;i<=5000;++i) ans+=f[g][1][5000+i][2];
for(i=1;i<=n;++i) ans/=i;
out(ans);
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
if(k<=8) solve(db::f);
else solve(flt::f);
}
Luogu P2612 [ZJOI2012]波浪的更多相关文章
- 【BZOJ2817】[ZJOI2012]波浪(动态规划)
[BZOJ2817][ZJOI2012]波浪(动态规划) 题面 BZOJ 洛谷 题解 首先这个差值最大也就是\(n^2\)级别的. 那么这样子就可以压进状态啦. 我们把这个操作看成一个个加数的操作,按 ...
- 洛谷2612&&bzoj2817 [ZJOI2012]波浪
洛谷2612&&bzoj2817 [ZJOI2012]波浪 原题链接 题解 因为有abs不太好搞,考虑拆掉abs. 生成排列的方法之一:n个空位,从1到n一次插入一个空位. 这样搞的话 ...
- 题解 洛谷 P2612 【[ZJOI2012]波浪】DP+高精
题目描述 题目传送门 分析 因为有绝对值不好处理,所以我们强制从小到大填数 设 \(f[i][j][p][o]\) 为当前填到了第 \(i\) 个数,波动强度为 \(j\),有 \(p\) 个连续段并 ...
- bzoj2817[ZJOI2012]波浪
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2817 波浪 [问题描述] 阿米巴和小强是好朋友. 阿米巴和小强在大海旁边看海水的波涛.小 ...
- [ZJOI2012]波浪
Description: L = | P2 – P1 | + | P3 – P2 | + - + | PN – PN-1 | 给你一个N和M,问:随机一个1-N的排列,它的波动强度(L)不小于M的概率 ...
- Luogu2612 ZJOI2012 波浪 DP
传送门 花掉了自己用来搞学科的时间做了这道题-- 一道类似的题:Here 考虑拆开绝对值计算贡献.那么我们对于\(1\)到\(N\)的排列,从小到大地将插入它们插入排列中. 假设我们现在计算到了数\( ...
- Luogu P2597 [ZJOI2012]灾难
一道非常综合的好题然后就莫名其妙地知道了动态LCA的求法 果然是ZJOI的题目,只能说这思路服了 首先我们发现每次操作只会灭绝一种动物,然后我们想一下就知道如果有\(n(n>=2)\)个食物的动 ...
- [ZJOI2012]波浪弱化版(带技巧的DP)
题面 \(solution:\) 这道确实挺难的,情况特别多,而且考场上都没想到如何设置状态.感觉怎么设状态不能很好的表示当前情况并转移,考后发现是对全排列的构造方式不熟而导致的,而这一题的状态也是根 ...
- Luogu 2173 [ZJOI2012]网络 - LCT
Solution $LCT$ 直接上$QuQ$ 注意$cut$ 完 需要 $d[u + c * N]--$ 再 $link$, 不然会输出Error 1的哦 Code #include<cs ...
随机推荐
- 暑假集训 div1 B Derangement 交换数字 思维死角
B. Derangement time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- Springboot 使用JdbcTemplate
Springboot 使用JdbcTemplate book package com.draymonder.book.jdbc; public class Book { private Integer ...
- R & and &&
https://blog.csdn.net/jining11/article/details/84933110 和C中的&不用,不要用&&,一般情况都是用&表示并且
- TCP序列号和确认号
TCP序列号和确认号详解 在网络分析中,读懂TCP序列号和确认号在的变化趋势,可以帮助我们学习TCP协议以及排查通讯故障,如通过查看序列号和确认号可以确定数据传输是否乱序.但我在查阅了当前很多资料后发 ...
- Spring boot之JPA
JPA 步骤: (1)在pom.xml添加mysql,spring-data-jpa依赖 (2)在application.properties文件中配置mysql连接配置文件 (3)在applicat ...
- docker容器的学习
什么是docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2.0 授权协议开源 ...
- 删除oracle居家必备
- Python学习笔记:第一次接触
用的是windows的IDLE(python 3) 对象的认识:先创建一个list对象(用方括号) a = ['xieziyang','chenmanru'] a 对list中对象的引用 a[0] # ...
- wls12C启用Gzip
https://community.oracle.com/message/14109820 https://docs.oracle.com/middleware/1221/wls/NOTES/what ...
- orcal 中的orcal用法
ROWID是数据的详细地址,通过rowid,Oracle可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普通的堆表中的rowid是物理rowid,索引组织表 ...