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

  1. #include<set>
  2. #include<map>
  3. #include<queue>
  4. #include<stack>
  5. #include<cstdio>
  6. #include<cstring>
  7. #include<iostream>
  8. #include<algorithm>
  9. #define inf (1<<30)
  10. #define ll long long
  11. #define RG register int
  12. #define rep(i,a,b) for(RG i=a;i<=b;i++)
  13. #define per(i,a,b) for(RG i=a;i>=b;i--)
  14. #define maxn 1005
  15. #define add(x,y) e[++cnt].v=y,e[cnt].next=head[x],head[x]=cnt
  16. using namespace std;
  17. typedef pair<int,int> pir;
  18. int n,m,id,cnt;
  19. int h[maxn][maxn],val[maxn][maxn],head[maxn*maxn];
  20. int rec[maxn][maxn];
  21. int dir[][]={{,},{-,},{,},{,-}};
  22. ll ans,V[maxn*maxn],f[maxn*maxn];
  23. struct E{
  24. int v,next;
  25. }e[];
  26. inline int read()
  27. {
  28. int x=,f=;char c=getchar();
  29. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  30. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  31. return x*f;
  32. }
  33.  
  34. void DO(int x,int y)
  35. {
  36. ++id;int num=;
  37. queue<pir> que;
  38. que.push((pir){x,y});
  39. pir u;int tx,ty;
  40. while(!que.empty())
  41. {
  42. u=que.front();que.pop(),++num;
  43. rec[u.first][u.second]=id,V[id]+=val[u.first][u.second];
  44. rep(i,,)
  45. {
  46. tx=u.first+dir[i][],ty=u.second+dir[i][];
  47. if(tx<||tx>n||ty<||ty>m) continue;
  48. if(rec[tx][ty]) continue;
  49. if(h[tx][ty]!=h[u.first][u.second]) continue;
  50. que.push((pir){tx,ty});
  51. }
  52. }
  53. if(num>) V[id]<<=;
  54. }
  55.  
  56. ll LongPath(int u)
  57. {
  58. if(f[u]!=-) return f[u];
  59. f[u]=;
  60. for(int i=head[u];i;i=e[i].next)
  61. {
  62. f[u]=max(f[u],LongPath(e[i].v));
  63. }
  64. f[u]+=V[u];
  65. return f[u];
  66. }
  67.  
  68. int main()
  69. {
  70. freopen("road.in","r",stdin);
  71. freopen("road.out","w",stdout);
  72. n=read(),m=read();
  73. rep(i,,n)rep(j,,m) h[i][j]=read();
  74. rep(i,,n)rep(j,,m) val[i][j]=read();
  75. rep(i,,n)rep(j,,m) if(!rec[i][j]) DO(i,j);
  76. int tx,ty;
  77. rep(x,,n)rep(y,,m)rep(i,,)
  78. {
  79. tx=x+dir[i][],ty=y+dir[i][];
  80. if(tx<||tx>n||ty<||ty>m||h[tx][ty]>=h[x][y]) continue;
  81. add(rec[x][y],rec[tx][ty]);
  82. }
  83. memset(f,-,sizeof(f));
  84. rep(i,,id) ans=max(ans,LongPath(i));
  85. cout<<ans;
  86. return ;
  87. }

道路 [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. ReactNative——页面跳转

    效果图: 进入工作目录,运行 react-native init NavigatorProject 创建项目NavigatorProject import React, { Component } f ...

  2. MVC AOP解决JsonResult返回json时间格式

    新建JsonNetResult类:JsonResult public class JsonNetResult: JsonResult { public JsonNetResult() { Settin ...

  3. 升级 Apache Tomcat的办法

    1.下载最新的7系列tomcat cd /usr/local/software wget https://www-us.apache.org/dist/tomcat/tomcat-7/v7.0.92/ ...

  4. MySQL 存储过程与事物

    一:存储过程    存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能     存储过程的好处:   1.由于数据库执行动作时,是先编 ...

  5. 通过安装memadmin对memcache进行可视化管理

    https://blog.csdn.net/reblue520/article/details/70792891

  6. Centos6安装SaltStack

    rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_64/epel-release-6-8.noarch.rpm yum install ...

  7. kickstart-E

    A题 简答模拟题 #include <iostream> #include<stdio.h> #include <set> #include <algorit ...

  8. springboot的三种启动方式

    一:IDE 运行Application这个类的main方法 二:在springboot的应用的根目录下运行mvn spring-boot:run 三:使用mvn install 生成jar后运行 先到 ...

  9. haoi2018

    题解: 题目相对其他省难一点 不过弱省省选知识点都这么集中的么.. 4道数学题... 1.[HAOI2018]奇怪的背包 这题考场做就gg了... 其实我想到了那个性质.. 就是这个一定要是gcd的倍 ...

  10. hdu2036

    题解: 求多边形面积 分成很多块三角形求就可以了 凹的也是支持的 代码: #include <bits/stdc++.h> using namespace std; #define rin ...