感觉JOISC的题目要么很经典,要么很妙,所以特意来刷一下。
Day 1
T1「JOISC 2014 Day1」巴士走读
考虑到时刻的种类数不超过\(m\)种,因为肯定是第一个点有一条边开通了然后对其造成了影响,所以可以处理出\(m\)种然后每次查询二分。
我们考虑时间降序加入\(1\)号点的出边。并对于每个点维护当前能最早什么时候到。
每加入一条边,我们就看能不能更新To的答案,如果能更新,那么入队并在To这个节点看有没有能继续走的边,在事先对每个点出边的出发时间排好序的情况下容易发现每条边只会被走一次,时间复杂度\(O(mlogm+n+Qlogm)\)
提交记录
T2「JOISC 2014 Day1」有趣的家庭菜园
显然这个东西考虑从大往小。
手玩一下发现其实最终序列是一段单调不降,再一段单调不升的东西。
从大到小后显然一个点只能放到当前段的最开头和最末尾。
然后算一下能造成多少逆序对贡献两边贪心一下就好了。
提交记录
T3「JOISC 2014 Day1」历史研究
似乎是一个回滚莫队裸题来着。
提交记录
T4「JOISC 2014 Day1」拉面比较
记得这个东西大概CSP-S初赛的时候还考过。
首先显然有一个\(2n-2\)次的两个分别扫一遍的做法。
我们对于每两个分组,在一组的先花\(\frac{n}{2}\)次找到哪个最大哪个最小。
然后最大只要跑每个组中的最大,最小只要跑每个组的最小就好了。
大概是\(\frac{3}{2}n-2\)次询问。
提交记录
Day 2
T1「JOISC 2014 Day2」水壶
考虑询问肯定是跑出最小生成树然后看树上两点间的路径上权值的最大值。
把两两之间的边建出来肯定不行,因为这个是网格图考虑性质。
如果一个点在两个点之间,那么这两个点的之间的边不需要建边。
所以我们考虑处理出一个网格图上的点最近的关键点,这个直接多源bfs就好了。
然后找到一个点,如果它的四周有和它最近关键点不一样的点,那么就建边,可以发现边数最多为\(2NM\)的
然后复杂度就是\(O(NM(logN+logM)+QlogP)\)
提交记录
T2 「JOISC 2014 Day2」交朋友
考虑一个点如果有多于一个儿子,那么这些儿子肯定互相可以连边。
又因为两个点有边,所以两个点和两个点的儿子之间肯定互相有边。
容易发现这是一个集合合并的过程,只会合并\(n-1\)次,因此每次暴力合并就好了。时间复杂度\(O(n)\)
提交记录
T3 「JOISC 2014 Day2」邮戳拉力赛
手玩可以发现一定是一条\(0\)到\(n+1\)的链上挂着一大堆环。
每个环是由一次上行台走到下行台,再在下面从下行台走到上行台再走回来的过程,容易发现每个上行台走到下行台与下行台走到上行台一一对应。
所以我们设\(dp_{i,j}\)为当前到了第\(i\)个点,还有\(j\)次下行台走到上行台没有被抵消掉。
然后就是一个完全背包了,时间复杂度\(O(n^2)\)
提交记录
Day 3
T1 「JOISC 2014 Day3」JOIOJI
扩展到\(k\)维也不是不可以。
先考虑两种值的时候,那么我们将\(J\)设成\(1\),\(O\)设成\(-1\),答案就是最长的总和为0的区间长度。
对其前缀和以后容易发现就是找前缀和值一样的最长长度。
扩展到三个之后也是一样的做法,将限制拆解成\(J\)和\(O\)一样多且\(J\)和\(I\)一样多然后对这两个分别前缀和,要求区间两个端点这两个值都一样。这个随便处理就好了。
用了个map,时间复杂度\(O(nlogn)\)
提交记录