2018-2019 ACM-ICPC, Asia East Continent Finals

有些题目还不会写,留个坑吧。(我太菜了哭哭

A - Exotic … Ancient City

场未A,留坑。

B - Mysterious … Host

场未A。

原来就是不同析合树的个数,之前都没听说过, dp \text{dp} dp 一下即可。

C - Heretical … Möbius

场A(-3)。

事实上写的暴力。

通过打表发现可以先判掉 1 1 1 很多或者很少的情况。

考虑 μ i = 0 \mu_i=0 μi=0 是因为 i i i 有平方因子,由于给定串的总长很小所以先考虑 4 , 9 , 25 , 49 4,9,25,49 4,9,25,49 的倍数,我们可以枚举每 4 4 4 位都为 0 0 0 ,每 9 9 9 位都为 0 0 0 等等的一些起始位置,那这个起始位置模这些数就确定了,也就是我们可以知道这个起始位置模 44100 44100 44100 的值 x x x ,然后再去判断 x + 44100 k x+44100k x+44100k 可不可以就行了。

判断的话先判断 121 121 121 169 169 169 的位置,然后再去判断这 200 200 200 个数合不合法。

复杂度玄学,能过。

D - Deja vu of … Go Players

场1A。判断 n , m n,m n,m 大小即可。

E - Immortal … Universe

场未A,场后听题解过。有点点难讲。

如果只有一个串,那就是要求前缀最小值 ≥ 0 \ge 0 0

现在有两个串,如果两个前缀最小值都 ≥ 0 \ge 0 0 ,那就合法。假设第一个串的前缀最小值为 − k -k k ,那么我们考虑第二个串前 k k k 个数一定要填 V \text{V} V ,且 [ k + 1 , n ] [k+1,n] [k+1,n] 这些位置的和要 ≥ 0 \ge 0 0 ,这些位置的前缀最小值要分讨一下,如果第一个串的前缀最小值为总和,则要 ≥ 0 \ge 0 0 ,否则只要 ≥ − 1 \ge -1 1 即可。具体可以画出坐标系,从 ( 0 , 0 ) (0,0) (0,0) 出发,向右为选一串,向上为选二串,然后有黑点和白点,黑点表示不能到达的点。而如果一个白点上右都不能走的话那就是不合法的。所以我们要让每个白点都能走。

这样我们考虑倒着 dp \text{dp} dp 即可: f i , j , 0 / 1 f_{i,j,0/1} fi,j,0/1 表示 [ i , n ] [i,n] [i,n] 这些位置的前缀最小值为 j j j ,和是否为前缀最小值的方案数。

效率: O ( n 2 ) O(n^2) O(n2)

F - Interstellar … Fantasy

场A(-2)。能沿着线段走就直接走,不能的话就沿着切线走,再走圆弧,最后再沿着切线走即可。

G - Omnipotent … Garland

场未A。没看。留坑。

H - Saintly … Coins

场未A。没看,听说是很难的模拟。

I - Misunderstood … Missing

场1A。

每次加都是对后面的操作造成影响,所以考虑倒着 dp \text{dp} dp

f i , j , k f_{i,j,k} fi,j,k 表示 [ i , n ] [i,n] [i,n] 轮,发动了 j j j 次攻击,攻击的下标和为 k k k 的最大攻击总和。

然后枚举第 i i i 轮做了哪个操作即可。

效率: O ( n 4 ) O(n^4) O(n4)

J - Philosophical … Balance

场1A。

根据纳什均衡的思想,我们希望分配 p k p_k pk 后,对于每个 j j j ,我们让 ∑ p k lcp ( s k , s j ) \sum p_k \text{lcp}(s_k,s_j) pklcp(sk,sj) 尽量相等。

看到 lcp ( s k , s j ) \text{lcp}(s_k,s_j) lcp(sk,sj) 就会想到反串后建后缀自动机得到 parent \text{parent} parent 树,于是我们考虑遍历这棵树,对于每个子树,我们要对 np \text{np} np 类节点分配 p p p 使得他们的总和为 1 1 1 并且在这个子树内的那个值相等,对于 i i i 子树,我们记这个值为 f i f_i fi

考虑到如果根节点 i i i 就是 np \text{np} np 类节点,那么无论 p p p 怎么分配,这个点在这个子树内的值就是 l e n i len_i leni ,那我们就可以让这个点的 p p p 1 1 1 ,其它的 p p p 0 0 0 ,这样每个点的值都为根节点的 l e n i len_i leni ,故 f i = l e n i f_i=len_i fi=leni

然后如果根节点 u u u 不是 np \text{np} np 类节点,那我们可以对它每个子树分配 p p p ,且 p p p 的和为 1 1 1 ,那么每个子树 i i i 的值会变成 p i f i + ( 1 − p i ) l e n u p_i f_i+(1-p_i)len_u pifi+(1pi)lenu ,变形一下就是 p i ( f i − l e n u ) + l e n u p_i(f_i-len_u)+len_u pi(filenu)+lenu ,可以把 p p p 看成 x x x ,这个值看成 y y y ,那每个子树的截距都相同,斜率都为正,因此我们可以二分最终 u u u 子树的点的值都会变成什么,然后比较一下 p p p 的和和 1 1 1 的大小即可。

效率: O ( n log ⁡ n ) O(n\log n) O(nlogn)

K - Desperate … Fire Survive

场未A,场后听题解A。

f i , j = m i n r + 1 f_{i,j}=min{r}+1 fi,j=minr+1 r r r 表示 [ i , r ] [i,r] [i,r] 可以表示出 j j j 的右端点。那么 f i , j = m i n ( f f i , j − 1 , j − 1 , n e x t i , j + 1 ) f_{i,j}=min(f_{f_{i,j-1},j-1},next_{i,j}+1) fi,j=min(ffi,j1,j1,nexti,j+1) ,其中 n e x t i , j next_{i,j} nexti,j 表示 ≥ i \ge i i 的第一个 = j =j =j 的位置。

于是离线,考虑到对于每个 j j j dp \text{dp} dp 值相同的都是连续的一段,且 dp \text{dp} dp 值不降,所以我们可以考虑把 dp \text{dp} dp 值相同的放在一起转移。

发现段数总和是 n log ⁡ m n\log m nlogm 级别的。于是做完了。

L - Eventual … Journey

场A(-1)。每个点到其他点的答案只有可能是 1 , 2 , 3 1,2,3 1,2,3 ,分讨即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值