首页 > 其他分享 >P9189 [USACO23OPEN] Custodial Cleanup G 题解

P9189 [USACO23OPEN] Custodial Cleanup G 题解

时间:2023-09-07 22:33:41浏览次数:37  
标签:房间 USACO23OPEN le 颜色 题解 Custodial bfs 钥匙 FJ

Description

奶牛旅馆可以被看作一个 \(N\) 个节点 \(M\) 条边的无向简单图,其中每个房间有一个颜色 \(C_i\),以及一个钥匙,颜色为 \(S_i\), FJ 最初在 \(1\) 号节点,手上一把钥匙都没有。

FJ 可以进行无数次以下操作:

  • 捡起当前房间的钥匙。(FJ 可以同时手持多个钥匙)

  • 将部分或全部手上的钥匙放在当前房间。 (房间内可以同时放多把钥匙)

  • 通过一条边,移到一个相邻的房间,前提是目标房间是房间 \(1\), 或者 FJ 拥有至少一个目标房间颜色的钥匙。

已知 \(F\) 是 \(S\) 的排列, FJ 想要让每个房间里面都恰好有一个 \(F_i\) 颜色的钥匙,求是否可能。

有 \(T\) 组数据,每组数据由一个空行开始,接着先给定 \(3\) 行每行 \(N\) 个整数,分别表示 \(C\),\(S\),\(F\),最后给定 \(M\) 行,每行两个整数表示一条边。

\(0 \le M \le 10^5\), \(1 \le C_i, S_i, F_i, u_i, v_i \le N \le 10^5\)。
\(1 \le T \le 100\), \(1 \le \sum N \le 10^5\), \(1 \le \sum M \le 2\cdot 10^5\)。

Solution

首先如果一边捡钥匙一边放钥匙一定是不优的,因为如果不放当前的钥匙,那么后面能捡的钥匙一定不会减少,还会多出一些额外的钥匙。那么如果只捡钥匙都捡不全的话其他所有的方案也一定不可能成功。


先考虑怎么才能捡到能捡到的所有钥匙。

设 \(p_i\) 表示捡钥匙序列的前 \(i\) 个钥匙颜色组成的集合,那么如果第 \(i\) 个钥匙是 \(s_v\),一定要满足 \(c_v\in p_{i-1}\) 才能捡 \(s_v\)。

于是 bfs 就呼之欲出了,每次直接跑当前已经捡了钥匙的点的所有邻居,如果能捡就捡。

但是这样有个问题,如果一个钥匙颜色为 \(1\) 的点旁边有很多颜色为 \(2\) 的点,但是 \(1\) 点走很多步能到达一个钥匙颜色为 \(2\) 的点 \(u\),且 \(u\) 与这些颜色为 \(2\) 的点不相邻,这个做法就无法捡到所有钥匙。

考虑用一个 set \(st\) 维护当前所有遍历过的点中,颜色为 \(i\) 的点中有多少还不能捡,那么每次从队列里取出一个点 \(u\),就可以先把所有 \(st_{s_u}\) 里的点捡了,然后继续像上面那样遍历即可。


然后是怎么尽可能地把捡来的钥匙放到每个点上。

设 \(p_i\) 表示放钥匙序列的前 \(i\) 个钥匙颜色组成的集合,\(q_i\) 表示放钥匙序列的从 \(i\) 开始的后缀组成的集合,那么如果第 \(i\) 个钥匙是 \(s_v\),一定要满足 \(c_v\in \text{total}-p_{i-1}=q_{i}\) 才能放 \(f_v\)。

于是只要向刚才那样从 \(1\) 开始跑一遍 bfs 即可,注意如果 \(f_v\notin q_{i+1}\) 但是 \(f_v=c_v\) 的话同样是可以放到队列里的。


还有个细节就是不一定能捡到全部的钥匙,那么说明第一次 bfs 中没有被捡的点一定不会再被改变,那么如果它们的初始钥匙和结束钥匙颜色不同就说明一定不合法。而且第二次 bfs 如果遇到了个不可能被经过的点就直接跳过,否则有可能 bfs 到一个不可能经过的点但是这个

标签:房间,USACO23OPEN,le,颜色,题解,Custodial,bfs,钥匙,FJ
From: https://www.cnblogs.com/Scarab/p/17686274.html

相关文章

  • All Pairs Maximum Flow题解
    前置知识:1.P3376【模板】网络最大流2.P4897【模板】最小割树(Gomory-HuTree)Ebola有一句很著名的话如果你乱搞过了我请你抽烟那么这道题肯定不能普通的dinic直接水过去,不然就不是紫题了,那么直接祭出最小割树,复杂度\(O(Tn^3m)\),但是因为dinic跑不满,所以是可以过的。......
  • [题解] AtCoder Beginner Contest 308 A~G
    AtCoderBeginnerContest308A~GA.NewSchemevoidMain(){vector<i64>a(8);for(auto&x:a)cin>>x;if(!is_sorted(a.begin(),a.end())&&!all_of(a.begin(),a.end(),[](auto&x){returnx%25!=0||!(100......
  • CF1374E2 Reading Books(hard version) 题解
    CF1374E2ReadingBooks(hardversion)这道题是在CF1374E1ReadingBooks(easyversion)的基础上出的,而且仅仅增加了一个\(m\)的限制,下面的做法也是基于简单版的思路而想到的。建议先尝试简单版,然后尝试此题。题意简述:有\(n\)本书,每本书有一个阅读时间\(t_i\),和属性\(......
  • Eclipse里做JBPM工作流gpd.xml中文乱码问题解决
         刚开始接到是做一个简单的文档借阅流程,对于流程定义是采用eclipse中的jbpm插件,但存在一个问题是节点中文命名的在gpd.xml中全部为乱码或根本看不到任何东西。     但是网上有人说没关系,这只是eclipse本身存在的一个bug,在项目所在硬盘目录下打开该文件还是显示正常......
  • 题解 [NOIP2018 提高组] 赛道修建
    题目链接挺综合的一道题目。询问最小值最大,考虑二分最小值,二分上下界是\([最小边权,树的直径]\),但是为了方便我们直接设为\([1,5\times10^8]\)即可。考虑如何\(check\),可以采用类似树形\(dp\)的方式进行贪心。对于节点\(u\)的子树,\(u\)内部的点显然可以构成几条链,同......
  • 【PCL】使用kdtree时pop_t报错问题解决
    问题描述在使用kdtree时,遇到的报错,具体报错信息如下:提示找不到pop_t,点击错误信息会进入到dist.h文件中问题解决解决办法很简单,在这里简单总结一下进入dist.h文件中,将下面这行代码,应该是在源文件的503行:typedefunsignedlonglongpop_t;具体位置如下图所示:将这行代码......
  • FTP权限问题解析,553 Can't open that file: Permission denied
    FTP权限问题解析,553Can'topenthatfile:Permissiondenied FTP上传文件,提示553Can'topenthatfile:Permissiondenied原因:目录的所属组,所属用户属于root,导致FTP无法上传,修改组和所属用户为www即可chown-fRwww./*chgrp-fRwww./* ......
  • 9.6 CF1830 题解
    9.6CF1830题解A.CopilCopacDrawsTrees链接真弱智题不用讲B.TheBOSSCanCountPairs题意每组数据给你一个\(n\)和两个序列\(a,b\)。求有多少个数对\((i,j)\)满足\(1\lei<j\len\)且\(a_i\timesa_j=b_i+b_j\)。题解考虑\(a_i\timesa_j=b_i......
  • 【题解】CF2600DP 选练(23.9.5-23.9.6)
    低情商:感觉是比较套路的高情商:十分educational!!!CF258DLittleElephantandBrokenSorting题目描述:有一个\([1,n]\)的排列\(a\),会进行\(m\)次操作,操作为交换\((a_i,a_j)\)。每次操作都有\(50\%\)的概率进行。求进行\(m\)次操作以后的期望逆序对个数。\(n,m\le1......
  • 爱思创CSP第一轮模拟赛01易错题解析
    一.1.错误原因:不知道解析:正确答案B星型结构,类似于一颗星星,优点是节省材料,弊端是,如果源点计算机故障,那么网络就会瘫痪。环形结构,类似于一个环,环上有一些端点,每个端点对应着一台计算机,弊端是,如果在环上断了2条边,网络就会瘫痪网状结构,就是现在的因特网(Internet),类似于一张图,......