ICPC 2018 Asia Hanoi Regional Contest
A. Amazing Adventures
B. Bipartite Battle
solved by rdc 135min
- sdcgvhgj 打表找出了规律,发现 sg 值只和点数和边数的奇偶性有关。
- 数学归纳之。
C. Conquest Campaign
solved by rdc 16min
- 超级源点,BFS。
D. Divide Doughnut
solved by rdc 199min -3
- 注意到长度为 5e8 的窗口,滑动一步,1 的个数变化的绝对值,不超过 1。
- 介值定理。
心路历程
- 这个次数限制是什么东西?它为什么是 log 根号啊。
- 这个每一部分都不超过 1 有什么用啊?想不通啊。
- 窗口一滑。窗口内 1 的个数变化不超过 1.
- 定义 \(f(x)\) 表示从 \(x\) 开始长度为 5e8 的区间内 1 的个数,问题等价于找零点。
F. Fun with Fibonacci
upsolved by sdcgvhgj
题意
- 定义\(G(i,n)=F(G(i-1,n)),G(1,n)=F(n)\),\(F\)为斐波那契数列,求\(G(k,n)\%p\)
- \(10^5\)组数据,\(1≤n,k≤10^{18},1≤p≤10^6,p\)为任意正整数
做法
- 斐波那契数列循环节是经典问题,可以\(O(log^2n)\)求得,设斐波那契数列模\(p\)的循环节为\(f(p)\)
- 设\(G(k,n,p)=G(k,n)\%p\),于是有:\(G(k,n,p)=F(G(k-1,n,f(p))\%p\),于是有了\(O(k*log^2n)\)的做法
- 发现有这样一个性质,不管初始\(p\)为何值,在递归不超过20层之后一定会达到一个不动点,即\(f(x)=x\)的点,于是之后的递归\(p\)是不变的
- 于是问题就变成了每次把\(n\)变为\(F(n)\%p\),求\(k\)次之后的值。考虑从\(i\)向\(F(i)\)连边,于是就变成在\(p\)个点的基环森林(水母森林)上找环的问题,复杂度\(O(p)\)
- 打表发现不动点一共有9个,且最大为\(9375000\),并且每个点最多跳4次就会进基环里,于是我们只需要线性预处理每个基环森林的每个点会进到哪个环的哪个点就好了
- 设\(N=9375000\),求所有\(f(p)\)的复杂度可以通过记忆化达到\(O(NlogN)\)(\(O(log^2N)\)的复杂度求\(O(N/logN)\)个素数的值加\(O(logN)\)的复杂度求其他数的值)
- 这样每次查询的复杂度就是\(O(20logN)\)了
- code
H. Hydra's Heads
solved by sdcgvhgj 17min start 22min AC
签到
I. Insider's Identity
solved by sdcgvhg 99min
AC自动机经典问题
J. Jurassic Jungle
solved by rdc 185min -1
做法
- 完全不会证。先注意到环合法,再注意到团合法,再注意到左右集点数等的完全二分图合法。
- 接下来,想破脑袋也想不出其它合法的图了,烦死咯。
- 不如 try a try!
K. Kingdom of Kittens
23min start, 1737min upsolved by sdcgvhgj -17
题意 给平面n个点,问是否存在一个三角形使所有点都在其边界上
做法
- 所有点都在凸包上,且严格凸包点数小于等于6,WA
- 发现这样很多情况都不对,严格凸包的所有有点的边都需要被三角形包含
- 考虑枚举严格凸包的三条边然后check?被正方形hack
- 显然(大概)枚举两条边一定是对的,那另一条边怎么找?以及怎么check?
- 法一:枚举一个点,过这个点做已确定两边的角平分线的垂线做第三条边,然后check,TLE,而且涉及浮点运算
- 法二:在两侧分别分类讨论。看似很难讨论,但冷静分析一下发现还算简单,AC