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. JAVA追加写入文本文件

    public void method1() { FileWriter fw = null; try { //如果文件存在,则追加内容:如果文件不存在,则创建文件 File f=new File(&qu ...

  2. OpenCV trackbar 避免使用全局变量

    OpenCV trackbar 避免使用全局变量 在OpenCV中使用trackbar是交互式地图像处理的一种方式,例如用于图像阈值分割,用户可以一边调整阈值一边看效果.但是很不幸,绝大多数教程上使用 ...

  3. plsql的汉化问题

    1:汉化工具下载地址:https://www.allroundautomations.com/bodyplsqldevreg.html 汉化吗.然后选择chinese就行了: 2:对安装(解压缩好的哦 ...

  4. [转]Java Web笔记:搭建环境和项目配置(MyEclipse 2014 + Maven + Tomcat)

    来源:http://www.jianshu.com/p/56caa738506a 0. 绪言 Java Web开发中,除了基础知识外,开发环境搭建,也是一项基本功.开发环境包括了IDE.项目管理.项目 ...

  5. Codeforces 542A Place Your Ad Here

    Place Your Ad Here 把没用的第一类区间去掉之后, 排序, 然后枚举第二类区间, 在上面死命二分就好了. #include<bits/stdc++.h> #define L ...

  6. python 将列表(也可以是file.readlines())输出多个文件

    open_diff = open('yanggao.txt', 'r',encoding='utf-8')diff_line = open_diff.readlines() diff_match_sp ...

  7. hive启用压缩

    <property> <name>hive.exec.compress.intermediate</name> <value>true</valu ...

  8. IDEA创建javaSE项目

  9. day14,函数的使用方法:生成器表达式,生成器函数

    生成器表达式: #列表推导式 # y = [1,2,3,4,5,6,7,8] # x = [1,4,9,16,25,36,49,64] # x = [] # for i in y: # x.appen ...

  10. 组合数的简单求法(dfs)

    组合数的具体应用可以参考这个例子:https://www.cnblogs.com/FengZeng666/p/10496223.html 下面这段代码可以作为求组合数的固定套路或者公式: #inclu ...