【CF1611】E. Escape The Maze(easy+hard)

2023-10-30 03:48
文章标签 easy escape hard maze cf1611

本文主要是介绍【CF1611】E. Escape The Maze(easy+hard),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

E1题目链接:https://codeforces.com/contest/1611/problem/E1
E2题目链接:https://codeforces.com/contest/1611/problem/E2

分析

我们定义一个点叫做安全点,即走到这个点上即可到达安全的叶子节点(不会被朋友逮到);朋友初始站的点叫朋友点,否则叫非朋友点; d e e p [ i ] deep[i] deep[i]表示第 i i i号点的深度, m d [ i ] md[i] md[i]表示在第 i i i号点下面距离 i i i最近的朋友点的深度。

很明显若一个点是叶子节点,同时它是非朋友点,那么它就是一个安全点;同样很明显若一个点是朋友点,那么它以及它下方的点一定不是安全点。我们可以将安全点的状态转移向它的父亲点进行转移。
如何确定一个非叶子非朋友节点 i i i是否是安全点呢?若 i i i的孩子节点中有安全点,同时
在第 i i i号点下面距离 i i i最近的朋友点的距离比该点到 1 1 1号点的距离大( d e e p [ i ] − 1 < m d [ i ] − d e e p [ i ] deep[i]-1<md[i]-deep[i] deep[i]1<md[i]deep[i]),也就是朋友抓不到Vlad,那么 i i i号点就是一个安全点。

对于E1,只要判断最终 1 1 1号点是不是安全点即可。
对于E2,如果 1 1 1号点不是安全点,那么想一下,我们如果将所有的朋友点都尽量往上移动,移到最极限的位置(即刚好和Vlad碰到),然后dfs搜索到朋友点就 a n s + 1 ans+1 ans+1,并且不必再遍历下去。我们可以利用 m d md md数组来实现这个过程,即搜索到一个点 i i i满足 d e e p [ i ] − 1 ≥ m d [ i ] − d e e p [ i ] deep[i] - 1 \geq md[i] - deep[i] deep[i]1md[i]deep[i],就 a n s + 1 ans+1 ans+1,并且不必再遍历下去。

具体看代码

代码

E1

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
#define fi first
#define se second
#define lson (k << 1)
#define rson (k << 1 | 1)const ll LINF = 1e18;
const int INF = 1e9 + 7;
const int N = 2e5 + 10;
const int M = 1e6 + 10;
const ll P = 1e9 + 7;
const double eps = 1e-7;int n, k;
int f[N], safe[N], deep[N], md[N];
vector<int> g[N];void dfs(int u, int fa)
{deep[u] = deep[fa] + 1;if(f[u]){md[u] = min(md[u], deep[u]);return;}if(g[u].size() == 1 && u != 1){safe[u] = 1;return;}int ifsafe = 0, mn = INF;for(int i=0,v;i<g[u].size();i++){v = g[u][i];if(v == fa) continue;dfs(v, u);md[u] = min(md[u], md[v]);if(safe[v]) ifsafe = 1;}if(ifsafe && deep[u] - 1 < md[u] - deep[u]) safe[u] = 1;
}int main()
{int T = 1;scanf("%d",&T);while(T--){scanf("%d%d",&n,&k);for(int i=0;i<=n;i++) g[i].clear(), f[i] = deep[i] = safe[i] = 0, md[i] = INF;for(int i=1,x;i<=k;i++){scanf("%d",&x);f[x] = 1;}for(int i=1,u,v;i<n;i++){scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}dfs(1, 0);if(safe[1]) printf("YES\n");else printf("NO\n");}return 0;
}

E2

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
#define fi first
#define se second
#define lson (k << 1)
#define rson (k << 1 | 1)const ll LINF = 1e18;
const int INF = 1e9 + 7;
const int N = 2e5 + 10;
const int M = 1e6 + 10;
const ll P = 1e9 + 7;
const double eps = 1e-7;int n, k, ans;
int f[N], safe[N], deep[N], md[N];
vector<int> g[N];void dfs(int u, int fa)
{deep[u] = deep[fa] + 1;if(f[u]){md[u] = min(md[u], deep[u]);return;}if(g[u].size() == 1 && u != 1){safe[u] = 1;return;}int ifsafe = 0, mn = INF;for(int i=0,v;i<g[u].size();i++){v = g[u][i];if(v == fa) continue;dfs(v, u);md[u] = min(md[u], md[v]);if(safe[v]) ifsafe = 1;}if(ifsafe && deep[u] - 1 < md[u] - deep[u]) safe[u] = 1;
}void dfs2(int u, int fa)
{if(deep[u] - 1 >= md[u] - deep[u]){ans++;return;}for(int i=0,v;i<g[u].size();i++){v = g[u][i];if(v == fa) continue;dfs2(v, u);}
}int main()
{int T = 1;scanf("%d",&T);while(T--){ans = 0;scanf("%d%d",&n,&k);for(int i=0;i<=n;i++) g[i].clear(), f[i] = deep[i] = safe[i] = 0, md[i] = INF;for(int i=1,x;i<=k;i++){scanf("%d",&x);f[x] = 1;}for(int i=1,u,v;i<n;i++){scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}dfs(1, 0);if(safe[1]) printf("-1\n");else{dfs2(1, 0);printf("%d\n",ans);}}return 0;
}

这篇关于【CF1611】E. Escape The Maze(easy+hard)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/305384

相关文章

LibSVM学习(六)——easy.py和grid.py的使用

我们在“LibSVM学习(一)”中,讲到libSVM有一个tools文件夹,里面包含有四个python文件,是用来对参数优选的。其中,常用到的是easy.py和grid.py两个文件。其实,网上也有相应的说明,但很不系统,下面结合本人的经验,对使用方法做个说明。        这两个文件都要用python(可以在http://www.python.org上下载到,需要安装)和绘图工具gnup

11991 - Easy Problem from Rujia Liu?

题意: 输入一串整型数列,再输入两个数k,v,输出第k个v的序号。不存在则输出0,如第一个样例 8 41 3 2 2 4 3 2 11 3 //第1个3,序号为2,输出22 4 //第2个4,不存在,输出03 2 //第3个2,序号为7,输出74 2 思路: struct num {

HDU 1097 A hard puzzle(规律)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=1097 题意: 求a的b次方的最后一位。 题解: 直接从例子入手, 第一组数据 7 66,结果如下(只要最后一位所以模10) 7 9 3 1 7 9··· 循环节为4,即结果在4个数值内循环出现。 第二组数据 6 800,结果如下 6 6 6 6··· 循环节为1 ···

【开发工具】开发过程中,怎么通过Easy JavaDoc快速生成注释。

文章目录 引言什么是Easy JavaDoc?Easy JavaDoc用来干什么?如何使用Easy JavaDoc?安装Easy JavaDoc配置Easy JavaDoc使用Easy JavaDoc生成注释 Easy JavaDoc与IDEA自带注释的区别IDEA自带注释Easy JavaDoc Easy JavaDoc的优缺点优点缺点 步骤 1:打开设置步骤 2:找到Easy JavaD

HDU 4035 Maze (树状dp + 概率)

OJ题目 : click here ~~~ 题目分析 :这篇文章已经说的很好很好了 , 直接借用 ,猛戳~~ int n;double k[10002] , e[10002];double A[10002] , B[10002] , C[10002];vector<int> List[10002];bool dfs(int u , int father){if(List[u].s

easy简化封装

//confirm function Confirm(msg, control) {$.messager.confirm('确认', msg, function (r) {if (r) {eval(control.toString().slice(11));}});return false;}//loadfunction Load() {$("<div class=\"datagrid-ma

【HDU】 4067 Random Maze 费用流

Random Maze Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1114    Accepted Submission(s): 387 Problem Description In the game “A C

Easy Voice Toolkit - 简易语音工具箱,一款强大的语音识别、转录、转换工具 本地一键整合包下载

Easy Voice Toolkit 是一个基于开源语音项目实现的简易语音工具箱,提供了包括语音模型训练在内的多种自动化音频工具,集成了GUI,无需配置,解压即用。 工具箱包括 audio-slicer、VoiceprintRecognition、whisper、SRT - to - CSV - and - audio - split、vits 和 GPT - SoVITS 等。这些优秀

CodeForces 404E Maze 1D

题意: 一个机器人在数轴上的0点  给一串指令机器人按照指令走  为了使机器人最后一步走到一个从来没来过的位置  我们可以在数轴上放石头  每次机器人被石头卡住他就跳过当前的那个指令  问  最少使用石头前提下  一共几种放石头方法 思路: 很容易想到如果最后一个指令是L  那么机器人一定会停在0点的左边  因为如果停在右边  最后一步一定走在之前来过的位置上  同理最后一个指令是R

P problem、NP problem、NP-complete problem、NP-hard problem是什么

时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当程序所处理的问题规模扩大后,程序需要的时间长度对应增长得有多快。 一、多项式时间(Polynomial time) 多项式复杂度 容易看出,前面的几类复杂度被分为两种级别,其中后者的复杂度无论如何都远远大于前者。 像等,我们把它叫做多项式级复杂度,因为它的规模n出现在底数的位置; 非多项式级的复杂度 另一种像是等,它