道路 [NOIP模拟]
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模拟]的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- NOIP模拟题汇总(加厚版)
\(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
随机推荐
- python 内建函数
# # __geratteibute__class Itcast(object): def __init__(self,subject1): self.subject1 = subject1 self ...
- 定时获取MySQL库的大小
定时获取MySQL库的大小 获取数据库单个库的大小命令 [root@admin ~]# cat db_size.txt mysql -h 192.8.1.1 -uUSER -pPASSWORD -e' ...
- Quartz.NET(任务调度)与Topshelf(服务)的综合使用
http://www.cnblogs.com/jys509/p/4628926.html http://cron.qqe2.com/ Quartz_Topshlf_Demo.7z
- php7安装参数编译
系统:Centos6.8 软件包:php-7.0.14.tar.gz yum install bzip2 bzip2-devel -y yum install curl curl-devel -y y ...
- Nginx 拒接服务漏洞(CVE-2016-0747)整改
Nginx的拒绝服务漏洞主要影响版本为1.10.3之前的版本,为不影响原有nginx的使用,且为避免修改其它配置文件,可以通过编译nginx最新版本的执行文件去替换旧的执行文件,文中的场景为由ngin ...
- 【转】 诡异的ORA-02289: sequence does not exist
原文地址:http://blog.itpub.net/20801486/viewspace-695651/ 今天被开发人员告知在应用用户下无法查询自己创建的sequence的nextval值.当执行s ...
- MySQL函数大全 及用法示例
字符串函数 ASCII(str) 返回字符串str的第一个字符的ASCII值(str是空串时返回0) mysql> select ASCII('2'); -> 50 my ...
- vue-cli 部分浏览器不支持es6的语法-babel-polyfill的引用和使用
npm install --save-dev babel-polyfill babel-polyfill用正确的姿势安装之后,引用方式有三种: 1.require("babel-polyfi ...
- PHP远程下载图片,微信头像存到本地,本地图片转base64
方法一(推荐): function download_remote_pic($url){ $header = [ 'User-Agent: Mozilla/5.0 (Windows NT 6.1; W ...
- BZOJ2142 礼物 扩展lucas 快速幂 数论
原文链接http://www.cnblogs.com/zhouzhendong/p/8110015.html 题目传送门 - BZOJ2142 题意概括 小E购买了n件礼物,送给m个人,送给第i个人礼 ...