Description

我们看见了一个由 m 行 n 列的 1*1 的格子组成的矩阵,每个格子(I,j)有对应的高度 h[i][j]和初始的一个非负权值 v[i][j].我们可以随便选择一个格子作为起点,然后在接下来的每一步当中,我们能且只能到达与当前格子有边相邻的四个格子中的高度不超过当前格子高度的格子,每当我们到达一个新格子(包括一开始选择的初始格子),我们就能得到该格子的权值分,然后该格子的权值就会等概率变成不比当前的权值大的一个非负权值。每一个格子在满足前面条件情况下,可以走任意多次。我们希望得到一个最大的期望权值和路径,并给出这个最大的期望权值和。

Input
第一行两个正整数表示 m,n。
接下来的 m 行,每行 n 个正整数,表示 h[i][j].
接下来的 m 行,每行 n 个非负整数,表示 v[i][j].

Output
一行一个实数,表示所求的最大期望权值和。保留零位小数。

Sample Input
1 3
1 2 1
1 2 3

Sample Output
5

Data Range
对于 30%的数据,保证 n,m 不超过 100.
对于另外 20%的数据,保证不存在相同的高度的格子。
对于 100%的数据,保证 n,m 不超过 1000.所有权值与高度不超过 10^9.

Solution

对于高度相同的点可以重复来回走,把他们整体看成一个点,权值为v,每走完一次,他的权值变成[0,v]内的一个值的概率一样,那么期望的平均值为0.5v。每走一次,v'=0.5v,那么看成一个等比数列{vi},其中v1=v,vi=0.5vi-1,那么记等差数列前i项和为Si,当i→+∞时,Si→2v(形象理解:一个饼每次切1/2,最后切到无限小;严谨推理:等比数列求和公式,在次不做赘述)

那么对于相同高度的点,缩成一个点,如果缩点前的点数>1,最后权值×2,最后对于每个缩的点跑一边最长路即可(SPFA/DP)

要注意缩点BFS的写法,不要队列弹出时再记录,加入队列前就记录,否则可能会WA

Code

 #include<set>
#include<map>
#include<queue>
#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf (1<<30)
#define ll long long
#define RG register int
#define rep(i,a,b) for(RG i=a;i<=b;i++)
#define per(i,a,b) for(RG i=a;i>=b;i--)
#define maxn 1005
#define add(x,y) e[++cnt].v=y,e[cnt].next=head[x],head[x]=cnt
using namespace std;
typedef pair<int,int> pir;
int n,m,id,cnt;
int h[maxn][maxn],val[maxn][maxn],head[maxn*maxn];
int rec[maxn][maxn];
int dir[][]={{,},{-,},{,},{,-}};
ll ans,V[maxn*maxn],f[maxn*maxn];
struct E{
int v,next;
}e[];
inline int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void DO(int x,int y)
{
++id;int num=;
queue<pir> que;
que.push((pir){x,y});
pir u;int tx,ty;
while(!que.empty())
{
u=que.front();que.pop(),++num;
rec[u.first][u.second]=id,V[id]+=val[u.first][u.second];
rep(i,,)
{
tx=u.first+dir[i][],ty=u.second+dir[i][];
if(tx<||tx>n||ty<||ty>m) continue;
if(rec[tx][ty]) continue;
if(h[tx][ty]!=h[u.first][u.second]) continue;
que.push((pir){tx,ty});
}
}
if(num>) V[id]<<=;
} ll LongPath(int u)
{
if(f[u]!=-) return f[u];
f[u]=;
for(int i=head[u];i;i=e[i].next)
{
f[u]=max(f[u],LongPath(e[i].v));
}
f[u]+=V[u];
return f[u];
} int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
n=read(),m=read();
rep(i,,n)rep(j,,m) h[i][j]=read();
rep(i,,n)rep(j,,m) val[i][j]=read();
rep(i,,n)rep(j,,m) if(!rec[i][j]) DO(i,j);
int tx,ty;
rep(x,,n)rep(y,,m)rep(i,,)
{
tx=x+dir[i][],ty=y+dir[i][];
if(tx<||tx>n||ty<||ty>m||h[tx][ty]>=h[x][y]) continue;
add(rec[x][y],rec[tx][ty]);
}
memset(f,-,sizeof(f));
rep(i,,id) ans=max(ans,LongPath(i));
cout<<ans;
return ;
}

道路 [NOIP模拟]的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  3. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  4. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  5. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  6. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  7. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  8. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  9. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

随机推荐

  1. SVN_2008R2 搭建流程与规范

    Svn服务在win2008 搭建 1:svn服务的原理与架构 1.Svn服务可以理解为加强版的ftp文件服务器, svn采用HTTP协议的方式进行文件传输 2.服务端安装好后,普通用户也需要下载一个c ...

  2. 使用python调用wps v9转换office文件到pdf

    #!/usr/bin/python2.6 # -*- coding: utf-8 -*- # pip install timeout-decorator import os import win32c ...

  3. 如何保证Redis的高可用

    什么是高可用 全年时间里,99%的时间里都能对外提供服务,就是高可用 主备切换 在master故障时,自动检测,将某个slave切换为master的过程,叫做主备切换.这个过程,实现了Redis主从架 ...

  4. SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问

    SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问 https://blog.csdn.net/yft_android/article/details/80307672

  5. CentOS命令行向OSS上传文件或文件夹

    下载地址:https://helpcdn.aliyun.com/document_detail/50452.html?spm=a2c4g.11186623.4.2.KyQak3 百度云盘:https: ...

  6. noip飞扬的小鸟

    题解: 挺简单的题目 f[i][j]表示x坐标为i,y坐标为j的最小值 会发现那个东西是个完全背包 从f[i][j-a[i]]转移一下就是O(1)转移的了 另外上界为m这个要特判一下 我把sum[a[ ...

  7. Ant之build.xml详解

    Ant之build.xml详解 关键字: ant build.xml Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令.当编译 ...

  8. django源码分析

    原文网址 https://www.jianshu.com/p/17d78b52c732?utm_campaign=maleskine&utm_content=note&utm_medi ...

  9. img没有src属性时自动出现边框

    当img没有接收到src属性的时候会自动出现边框,border:0/none都不管用的情况下 解决方法 一行css 可以解决 img[src=""],img:not([src]){ ...

  10. TopCoder SRM502 Div1 1000 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-1000.html SRM502 Div1 1000 题意 从 [0,n-1] 中选择 k 个不同的 ...