2019 ICPC Asia Nanjing Regional
https://vjudge.net/contest/413140
J - Spy
题意: 表示对手的每个队伍战斗力, 表示打败对手后获得的分数, 表示我方第一种人的战斗力, 表示我方第二种人的战斗力。定义我方一组选手的战斗力为 ,第一种选手与第二种选手某种顺序两两组队后,与对方进行pk,共有 种pk顺序,求 最大期望。
KM最大权完备匹配
对于两种个人,即两种点集之间连边,关键在于边权的设定。
两个人结成一队,则该队的能力值确定了,可以算出以这个队面对对面的队伍的贡献的数学期望,即若他与对面所有队伍交手,它的胜负情况可以确定,且可以贡献的值也可以 确定,把对面所有队伍按照能力值排序,由小到大求前缀和即可,再每次二分找到位置。
若一个队伍能战胜的所有队伍的和为 ,则总的贡献为 ,期望为 ,答案要求乘以 ,则刚好剩下 ,即前缀和。
则边权定为这两人结对后对队伍的贡献 。
本题卡dfs的KM,只能用bfs KM。
1 |
|
F - Paper Grading
题意:给定 n 个字符串,m 次操作,两种操作:交换第 , 个字符串;给定一个字符串,询问与它的公共前缀长度 且下标在 的串的个数。
做法一:
离线+Trie+CDQ分治+树状数组
先把所有串都插到字典树里,则要找与某个串公共前缀大于等于 k 的串只需要在字典树上走 k 步,子树里的所有串都可以。子树的特点就在于dfs序是一个区间,所以就只要找到区间中的串的个数。
但是又要下标在 ,所以变成 且 ,这可以通过二维容斥变成求 ,,,。就变成了四个二维偏序问题。
对于交换操作,不能让它影响到它之前的询问,需要离线下来,并增加维度 ,变成三维偏序问题,CDQ分治解决。
CDQ分治通过先按照一维排序,并分治,使得满足条件 ,再通过类似归并排序的方法使得第二维有序,最后通过树状数组处理第三维。
1 |
|
做法二:
主席树+树状数组
这里就不需要离线了。
还是dfn和下标作为两个维度。
以下标作为主席树的根,dfn作为每棵线段树的范围。
由于主席树是前缀和,所以每次对一个单点修改时需要对下标 到 的所有线段树都修改,这可以通过套树状数组实现。
查询时对两个主席树树根查询,每个查询的范围都是 。
时间竟然比CDQ分治快了一倍。
1 |
|
I - Space Station
题意:给定一个数组,初始有数 , 如果已有的数大于等于 ,则能跳到 ,跳过去后已有的数加上 ,问每点经过恰一次的方案数。
当已有的数 ,之后就可以直接得到答案了。
所以直接dfs暴力枚举每一个数字,累加到已有数中,当已有数 时return。
但这样会T。
考虑记忆化搜索,map保存数组 ,记录每个数字还有几个,则状态相同等价于 数组相同,因为这时已有的数必定也相同。
不能直接map存数组,否则还是T,要先数组hash再存。
map也不能用,要用unordered_map。
还要优化,对于数字0,不论什么时候跳都行,所以先不管,最后处理。
1 |
|