B
lyf
C
wd
A
zrc
模拟
J
zrc
题意:给定一个$n*n(n\le 1000)$的国际象棋棋盘,上面有$m\le 1000$个rook(城堡)(中国象棋的车),现在每一步进行一个操作,即选择其中一个rook把能吃到的另一个rook吃掉,直到进行不了这样的操作(每一步都必须吃,不能进行普通移动)。问到结束的时候最多吃了几个rook,最少吃了几个。
解:
先考虑最多吃了几个。显然如果对每一对同一行的和每一对同一列rooks连边,所得连通块大小-1即这个连通块可以最多吃掉的rook数量。这个步骤在模拟赛时我用了并查集做,把每一行和每一列都开成一个size是0的点。复杂度$O((m+2n)\cdot\alpha(m+2n))$,但题解说深搜可以复杂度$O(m)$.不是很懂应该怎么操作。
再考虑最少吃了几个。模拟赛时lyf提供了一个几乎正确的贪心算法,即每次把入度最大的点删去,但对于3*3,9个rooks全满的情况就不行。思考许久,发现好像其实这玩意是个二分图上最小割。先把列和行都看成点,把S对列点连边,T对行点连边,每存在一个rook都增加一条相应的列点和边点之间的边。显然每行及每列最终最多只能存在一个rook,感受一下(实际上是不会说明怎么证)就可以发现这个显然是对的,样例也都对。由于数据范围极小,简短的匈牙利算法即可解决。
D
wd
E
lyf
题意:给定$n\le10^5$种货物,$m\le10^5$种交换条件,每种条件指的是1个a可以换x个b。假设货物都是无限的,问是否存在换来换去导致一个人可以无限获利的情况。
解:
显然建图,刚开始的想法是建一个DAG,从a到b连一条x的边,转化为求DAG上是否存在两条路径使得路径起点终点都相同但路径的乘积不同。这种想法一直没有结果,但DAG太诱人很难令人放弃。但其实最后还是换了个思路,不需要建DAG。对于刚才所说的DAG,每条边都加上一条权值1/x的反向边,并直接搜索(BFS DFS皆可)就做完了。题解说double的精度是够用的,但我们当时取了模数。当模数取1e9+7时是错误的,取998244353以及1e9+9也是错误的,取其中任意两个双哈希也是错误的。但是模拟赛时尝试用1e9+7和19260817就过了。赛后发现19260817单哈希就能过。+1s
复杂度$O(m)$
题解上说数据就是对着那几个有名的质数卡的。如果说是cf赛制的话,的确是要很小心别人用构造数据hack或者因此fst。但如果真的icpc赛制这么搞未免有点恶心。
G
wd
题意:给定一个矩阵,每个位置上有1~9的数字和+*两种符号,从左上角出发每一步只能向右或者向下走到达右下角,保证每条这样的路径组成的算式合法,问每个这样算式的和是多少。
解:
DP,开三个DP数组
补题
K
题意:有一架轰炸机,每到一个点就会以当前所在点为左上角把给定01矩阵中1的位置轰炸一次。轰炸机按照给定的上下左右顺序移动,问最终被轰炸了K次及以上的点有几个,题目保证不会炸到边界外
解:
首先可以把移动的过程模拟出来得到以每个点为左上角轰炸了几次。那么接下来要做的就是对一个01矩阵和一个记着次数的矩阵进行某种操作得到结果。可以发现这个过程非常像多项式相乘,考虑FFT。首先把二维情况压扁到一维然后思考一下发现直接FFT就做完了…裸的不行
1 | //by Richard |
F
题意:给定200个-1000到1000的点,求平面上点与前k远的给定点距离之和的最小值
解:
模拟赛时没有想法,估计得有几十万个峰,模拟退火也很难跑出来。
有想过尝试打平面情况的表找找看有没有什么性质,但是没时间了
结束后发现,可以证明是单峰的,那么显然可以三分套三分解决
同时,由于是单峰,模拟退火基本退化为爬山,当然也能跑出来
ZRC三分套三分:
1 | //by Richard |
LYF 模拟退火
1 |
|