【BZOJ2817】[ZJOI2012]波浪(动态规划)
【BZOJ2817】[ZJOI2012]波浪(动态规划)
题面
题解
首先这个差值最大也就是\(n^2\)级别的。
那么这样子就可以压进状态啦。
我们把这个操作看成一个个加数的操作,按照从小往大的顺序依次把每个数放到一个合法的格子上面去,那么对于先放的数,对于答案的贡献就是负的,否则就是正的。
那么每次放入一个数,考虑其贡献是什么。
如果其左右都没有数,则贡献是\(-2x\)。
如果一侧有数,则贡献是\(0\)。
如果两侧都有数,则贡献是\(2x\)。
显然填好的数是一段段的,那么上述的操作可以理解为联通块的合并操作。
第一个是新建一个联通块,第二个是扩展一个联通块,第三个是合并两个联通块。
那么我们的状态就可以写成,当前填第\(i\)个数,贡献之和是\(j\),一共有\(k\)个联通块。
这样是对的吗?
并不是,还有一点小问题,即填在边界上的数并没有那么好处理。
所以再加上一维表示边界上填数的数的个数(有两个边界啊QwQ)
那么转移的时候大力讨论一下就好啦~。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int py=4500;
int n,M,K;
namespace Task1
{
void Output(long double ans)
{
printf("0.");
for(int i=1;i<=K;++i)
{
ans*=10;int x=(i==K)?(ans+0.5):ans;
printf("%d",x);ans-=x;
}
puts("");
}
int main()
{
static long double f[2][105][9005][3],ans;
f[0][0][py][0]=1;
for(int i=1,nw=1,pw=0;i<=n;++i,nw^=1,pw^=1)
{
memset(f[nw],0,sizeof(f[nw]));
for(int j=0;j<i;++j)
for(int k=0;k<=4500+py;++k)
for(int l=0;l<=2;++l)
if(f[pw][j][k][l])
{
if(k-i-i>=0)f[nw][j+1][k-i-i][l]+=f[pw][j][k][l]*(j+1-l);//一个新的连通块
if(j)f[nw][j][k][l]+=f[pw][j][k][l]*(j+j-l);//作为一个连通块的一端
if(j>=2&&k+i+i<=9000)f[nw][j-1][k+i+i][l]+=f[pw][j][k][l]*(j-1);//连接两个连通块
if(k-i>=0)f[nw][j+1][k-i][l+1]+=f[pw][j][k][l]*(2-l);//作为一个端点
if(j&&k+i<=9000)f[nw][j][k+i][l+1]+=f[pw][j][k][l]*(2-l);//一个连通块延伸到了边界
}
}
for(int i=M;i<=4500;++i)ans+=f[n&1][1][py+i][2];
for(int i=1;i<=n;++i)ans/=i;
Output(ans);
return 0;
}
}
namespace Task2
{
void Output(__float128 ans)
{
printf("0.");
for(int i=1;i<=K;++i)
{
ans*=10;int x=(i==K)?(ans+0.5):ans;
printf("%d",x);ans-=x;
}
puts("");
}
int main()
{
static __float128 f[2][105][9005][3],ans;
f[0][0][py][0]=1;
for(int i=1,nw=1,pw=0;i<=n;++i,nw^=1,pw^=1)
{
memset(f[nw],0,sizeof(f[nw]));
for(int j=0;j<i;++j)
for(int k=0;k<=4500+py;++k)
for(int l=0;l<=2;++l)
if(f[pw][j][k][l])
{
if(k-i-i>=0)f[nw][j+1][k-i-i][l]+=f[pw][j][k][l]*(j+1-l);//一个新的连通块
if(j)f[nw][j][k][l]+=f[pw][j][k][l]*(j+j-l);//作为一个连通块的一端
if(j>=2&&k+i+i<=9000)f[nw][j-1][k+i+i][l]+=f[pw][j][k][l]*(j-1);//连接两个连通块
if(k-i>=0)f[nw][j+1][k-i][l+1]+=f[pw][j][k][l]*(2-l);//作为一个端点
if(j&&k+i<=9000)f[nw][j][k+i][l+1]+=f[pw][j][k][l]*(2-l);//一个连通块延伸到了边界
}
}
for(int i=M;i<=4500;++i)ans+=f[n&1][1][py+i][2];
for(int i=1;i<=n;++i)ans/=i;
Output(ans);
return 0;
}
}
int main()
{
scanf("%d%d%d",&n,&M,&K);
if(K<=8)Task1::main();
else Task2::main();
return 0;
}
【BZOJ2817】[ZJOI2012]波浪(动态规划)的更多相关文章
- 洛谷2612&&bzoj2817 [ZJOI2012]波浪
洛谷2612&&bzoj2817 [ZJOI2012]波浪 原题链接 题解 因为有abs不太好搞,考虑拆掉abs. 生成排列的方法之一:n个空位,从1到n一次插入一个空位. 这样搞的话 ...
- 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\)的排列,从小到大地将插入它们插入排列中. 假设我们现在计算到了数\( ...
- [ZJOI2012]波浪弱化版(带技巧的DP)
题面 \(solution:\) 这道确实挺难的,情况特别多,而且考场上都没想到如何设置状态.感觉怎么设状态不能很好的表示当前情况并转移,考后发现是对全排列的构造方式不熟而导致的,而这一题的状态也是根 ...
- Luogu P2612 [ZJOI2012]波浪
题目 我们考虑从\(1\)到\(n\)把每个数放到序列里面去,以消掉绝对值. 在最后的序列中,如果\(i\)的某一边是序列的边界,那么\(i\)会产生\(0\)的贡献.如果\(i\)的某一边是一个比\ ...
- 题解 洛谷 P2612 【[ZJOI2012]波浪】DP+高精
题目描述 题目传送门 分析 因为有绝对值不好处理,所以我们强制从小到大填数 设 \(f[i][j][p][o]\) 为当前填到了第 \(i\) 个数,波动强度为 \(j\),有 \(p\) 个连续段并 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
随机推荐
- 10-vue的介绍
vue的作者叫尤雨溪,中国人.自认为很牛逼的人物,也是我的崇拜之神. 关于他本人的认知,希望大家读一下这篇关于他的文章,或许你会对语言,技术,产生浓厚的兴趣.https://mp.weixin.qq. ...
- [转帖]中关村:LED屏幕和OLED屏幕有什么区别?答案在这里
LED屏幕和OLED屏幕有什么区别?答案在这里 中关村在线 01-0810:40 目前的电视市场,更新换代的频率越来越快,无论是国产品牌还是合资品牌,都不约而同的推出了全新产品.这离不开人们对更好 ...
- for循环游标
- 源码追踪,解决Could not locate executable null\bin\winutils.exe in the Hadoop binaries.问题
在windows系统本地运行spark的wordcount程序,会出现一个异常,但不影响现有程序运行. >>提君博客原创 http://www.cnblogs.com/tijun/ & ...
- K3BOM跳层
A自制件,B自制件,C外购件 ,结构为A-B-C 如果需要跳层,则设置A-B跳层,B-C跳层,则生成A计划订单,C计划订单, 假设单独A-B跳层,则MRP运算出的结果也是A计划订单,B计划订单,C计划 ...
- PhpStorm 配置链接远程虚拟机
安装好了 PhpStorm 之后,打开项目文件夹,接着点击工具栏 Tools: 2.接着点击 tools>Deployment: 3.点击Configuration 开始配置 4.填好箭头 ...
- windows环境下的git安装及使用
昨天晚上,我用了一个半小时整github,为了便于他人能快速的安装使用,也为了回顾一下自己痛苦的过程,特意写下这篇博客.好的,让我们开始吧.... 我的环境:win10,msysgit1.9.4.0 ...
- k8s使用Glusterfs动态生成pv
一.环境介绍 [root@k8s-m ~]# cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4 ...
- Yii的数值比较验证器
该验证器比对两个特定输入值之间的关系 是否与 operator 属性所指定的相同. compareAttribute:用于与原属性相比对的属性名称. 当该验证器被用于验证某目标属性时, 该属性会默认为 ...
- Essential Phone刷机教程
安装fastboot驱动(Essential-PH1-WindowsDrivers) 下载ADB刷机指令工具:platform-tools(ADB): 进入开发者选项,打开 USB 调试,OEM解锁选 ...