「USACO 2011 Jan. Gold」道路和航线
题目概述
如果去掉航线可以发现原图变成了许多连通块
若把一个连通块看成一个节点,则发现连通块和航线组成 DAG
考虑 Topo sort 结合 Dijkstra
称连通块和航线组成的图为
假设
大致是这个样子
1 | q <- Topo_Queue; |
如果去掉航线可以发现原图变成了许多连通块
若把一个连通块看成一个节点,则发现连通块和航线组成 DAG
考虑 Topo sort 结合 Dijkstra
称连通块和航线组成的图为
假设
大致是这个样子
1 | q <- Topo_Queue; |
Tarjan 缩点, 重构图 + 判可达性(某一个强连通分量能否到达终点,若不能,则不能更新 ans ) + 跑 DAG 上的 DP
用了一个结论:Tarjan 逆序即为拓扑序
具体看代码吧
1 |
|
正图反图跑 SPFA转移方程定义为
最后减一下
构造分层图,具体看上面
显然的贪心,先按学分
考虑要安排一个作业,显然是越晚越好,故用一个二分区间,用一个数据结构查询、修改
这里选择二分套树状数组
当一个数组
给你长度为
求好数组的个数,对 998244353
取模。
我写这一题是因为 BZOJ 的讨论
线段树(动态开点)裸题,讨论有点烦
题目非常简单,只要实现不带修改的区间个数查询就可以了(还有适当剪枝
为了方便,坐标先行后列。
设
不考虑不能传相同同学
从 A 到 B 再从 B 到 A
设
对于线路1,
对于线路2,
故对于
记忆化搜索
定义一个 solve(x, lim, dir)
x
表示处理完的层数,所有x == n
是就return
lim
是限制条件
dir
表示方向,true
为向上,false
向下
当 dir == true
时,显然有以下情况
height[x+1] > lim
solve(x+1, height[x+1], true)
solve(x+1, lim, true)
height[x+1] < lim
solve(x+1, lim, true)
solve(x+1, lim, false)
height[x+1] == lim
solve(x+1, lim, false)
当 dir == false
时,不能再换方向,显然有以下情况
height[x+1] > lim
solve(x+1, lim, false)
height[x+1] < lim
solve(x+1, height[x+1], false)
1 |
|