环游衢州

(walk.pas/c/cpp)

【问题描述】
Jason 想要带着他新叫的朋友环游 QZ, 于是他把 QZ 划分成了 n 个地方,已知这 n 个地方由 m 条双向边相连接,并且他把 n 个地方分别赋予了一个 happy 值,他希望按照 happy 值严格递减的方法去游览QZ, 这样他可以把一些最美的地方介绍给他朋友。 然而 Jason 的心态不太好,所以他有 k 次从小向大走的机会,问他最多能够带他的朋友游览几个地方,如果能够游览的地方数超过 10^9+7则输出“ infinity”
【输入格式】
第一行两个数 n,m, k 表示地方数、边数和反向次数
第二行 n 个数表示 n 个地点的 happy 值
然后 m 行每行两个数 a,b 表示 a, b 之间有一条无向边
【输出格式】
一行一个数表示最多能够游览的地方数或者“ infinity”
【输入样例1】
1 3 1
2147483647
1 1
1 1
1 1
【输出样例1】
2

【输入样例2】
10 30 20
720472486 1616090782 1659830133 376600248 1485380712 819748825 1072214931 1957734249 95302927 622052677
2 6
1 6
10 2
8 4
8 2
9 6
1 4
9 7
1 4
4 7
7 1
4 5
10 6
7 7
8 5
7 8
6 2
7 2
3 9
6 8
3 4
9 8
8 8
4 5
8 7
5 6
2 2
9 7
3 1
9 1

【输出样例2】
105

【样例解释】
在 1 号点的自环上走一步即可到达两个点。
【 数据说明】
对于 10%的数据: 1<=n<=10, 1<=m<=30, k=0
对于 30%的数据: 1<=n<=500, 1<=m<=2500, k=0
对于 60%的数据: 1<=n<=1000, m<=3000, k<=20
对于 100%的数据: 1<=n<=10^5, 1<=m<=2*10^5,k<=80, happy 值小于等于 2^31-1
【提示】
一个地点经过两次按两个地点算。
pascal 请勿使用 readln。

【题目分析】
这道题是典型的将求最长单调序列套在图的模型上,那么先将这个模型。
首先为了方便推,a[i]需要排序,但是这样会有一个严重的问题就是原来的图会被打乱,所以在实际操作中不能这样做,正确的做法应该另设一个数组id[i],表示排名为i的点在图中的具体位置,初始时id[i]=i,排序的时候排的标准是a[i],但是调动的是id[i],这样就可以不会改变原来的图了。
接下来就是DP的推法(以最长降为例):
f[i]同在序列中的定义,就是以i为结尾的最长降的路。转移时为了能得到更优的答案所以是从大到小推(这就是为什么需要进行排序),比较简单,代码如下:

for (int i=n;i;i--)for (int j=lnk[id[i]];j;j=nxt[j])if (a[id[i]]<a[son[j]]) f[id[i]]=max(f[id[i]],f[son[j]]+1);

回到这道题,不过就是添加了一个可以逆走的次数,那么就把逆走的次数带到转移中,f[T][i]表示使用了T次逆走,目前在i点的距离,转移方程就比较简单,详细看代码。

【复杂度】

时间:O(nT)(实际偏大); 空间:O(nT);

【代码】

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define maxn 100005
#define maxe 400005
#define tt 1000000007
int n,e,k,tot,ans,a[maxn],id[maxn],son[maxe],nxt[maxe],lnk[maxn],f[85][maxn];
inline void readi(int &x){x=0; char ch=getchar();while ('0'>ch||ch>'9') ch=getchar();while ('0'<=ch&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
}
void _add(int x,int y){tot++; son[tot]=y; nxt[tot]=lnk[x]; lnk[x]=tot;
}
inline int cmp_id(int i,int j){return a[i]<a[j];}
void _init()
{freopen("walk.in","r",stdin);freopen("walk.out","w",stdout);readi(n); readi(e); readi(k);for (int i=1;i<=n;i++) {readi(a[i]); id[i]=i;}tot=0;memset(son,0,sizeof(son));memset(nxt,0,sizeof(nxt));memset(lnk,0,sizeof(lnk));for (int i=1;i<=e;i++){int x,y; readi(x); readi(y);_add(x,y); _add(y,x);}sort(id+1,id+n+1,cmp_id);
}
void _solve()
{memset(f,0,sizeof(f));for (int i=n;i;i--)for (int j=lnk[id[i]];j;j=nxt[j])if (a[son[j]]>a[id[i]])f[0][id[i]]=max(f[0][id[i]],f[0][son[j]]+1);for (int t=1;t<=k;t++)for (int i=n;i;i--)for (int j=lnk[id[i]];j;j=nxt[j])if (a[id[i]]<a[son[j]]) f[t][id[i]]=max(f[t][id[i]],f[t][son[j]]+1);else f[t][id[i]]=max(f[t][id[i]],f[t-1][son[j]]+1);ans=0;for (int i=1;i<=n;i++)for (int j=0;j<=k;j++) ans=max(ans,f[j][i]);printf("%d\n",ans+1);
}
int main()
{_init();_solve();return 0;
}

PS:
如果各位神犇发现本博客有误,请一定及时告诉作者我这个菜鸟噢,新手上路,请多指教。

2017衢州联赛第四题题解相关推荐

  1. 2017衢州联赛第三题题解

    最大矩阵 (matrix.pas/c/cpp) [问题描述] 在看过萝卜同学的游戏后, Fbs 表示太无趣了.他想试试萝卜同学能不能玩点级别更高的游戏,于 是他想了个难度大点的. 首先他定义:一个矩阵 ...

  2. 2018省赛第九届蓝桥杯真题C语言B第四题题解 测试次数

    2018第九届蓝桥杯C++省赛B组[最新题解汇总] 标题:测试次数 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机 ...

  3. 2017年大计基算法题 题解

    [NOJ 2010]数因子 签到题,考虑数据范围达到10910^9,即思考O(1)O(1)时间内的解法. 具体有 ans={2 (l≠r)l (l==r) ans=\left\{ \begin{arr ...

  4. 2017年衢州联赛 T2

    2017年衢州联赛 T2 题目 题解 单调栈或单调序列 + 二分查找优化 代码(Pascal) var n,tot,ans:longint;a,q:array[0..50005]of longint; ...

  5. NOIP信息奥赛--1995“同创杯”初中复赛题题解(四)

    NOI'95 "同创杯"全国青少年信息学(计算机)奥林匹克竞赛 分区联赛复赛测试数据(初中组) 第四题 问题: 编码问题:设有一个数组A:ARRAY[0-N-1] OF INTEG ...

  6. 今日头条2018校园招聘后端开发工程师(第四批)编程题 - 题解

    做过第三批的题目,今日头条2018校园招聘后端开发工程师(第三批)编程题 - 题解和第二批的题目,今日头条2018校园招聘后端开发工程师(第二批)编程题 - 题解. 这一场题目还是挺好玩的,也挺有技巧 ...

  7. 题解-百度2017春招笔试真题编程题集合

    题目链接:https://www.nowcoder.com/test/4998655/summary 一共五题,从第五题开始写,难度由难到易 ----------------------------- ...

  8. 枚举求解单词方阵(洛谷P1101题题解,Java语言描述)

    题目要求 P1101题目链接 分析 可以用DFS做,但我立下了个Flag,所以就用了朴素的枚举来做.... 结果,我的天哪,做了好几个小时-- 其实这种地图题,真的适合 DFS or BFS or D ...

  9. 计算机模拟专业,2017年数值模拟专业知识题库

    2017年数值模拟专业知识题库 (一)填空题 1.建立数学模型常用的物理原理包括:  质量守恒原理  .  能量守恒原理  .  达西定律. 2.黑油模型中水相与其它两相不发生(质量转移):气可以从油 ...

最新文章

  1. 如何获取元素在父级div里的位置_前端面试题--元素的BFC特性和实例
  2. vs2008 外部调用ActiveX控件接口方法
  3. 安装Jumpserver
  4. jq的链式调用.end();
  5. 报告 | 2019程序员薪酬统计:软件开发比机器学习竟然更高?
  6. PHP 还有未来么,还是 25 岁就“寿终正寝”了?
  7. 问题:ajaxSuccess() ajaxComplete() ajaxError()....??? 参数event xhr options的用法
  8. Presto 安装与部署
  9. 三大邮箱品牌:网易,腾讯,阿里说明
  10. 网易云解锁灰色音乐PC、移动端都可用。
  11. 解决PHPstudy(PHP工具箱)中host文件无法保存的问题
  12. Vue运行环境及淘宝镜像(cnpm命令)安装
  13. 【机器学习】缺失值处理总结
  14. MySQL错误ERROR 1045 (28000): Access denied for user 'root'@'localhos
  15. ClassName::class
  16. HDU 5514 容斥原理
  17. 2020暑期腾讯小程序开发训练营结课心得
  18. 通过outlook邮箱实现windows、安卓、ios三平台日历同步
  19. Deeplink跳转提示应用下架
  20. 微视网媒:万亿城配的变局者,罗戈网专访绿色慧联总经理杨东

热门文章

  1. 一种改进的进化模型和混沌优化的萤火虫算法-附代码
  2. 操作系统_第二章_UNIX操作系统简介
  3. 安装 office2007时出现:1706的错误-解决方案
  4. 最近在做的用户留存分析,和几种方法。
  5. 杂谈:火星救援和未来城市
  6. 单样本和双样本的检验
  7. Linux安装云原生网关Kong/KongA
  8. Re5ilio 5ync:资源神器
  9. appium自动化,appium元素定位
  10. 工商管理如何利用计算机思维,论述工商管理人才素质的重要性