Atcoder ABC401 题解
ABC401
A
判断是否大于等于 \(200\) 且小于等于 \(299\) 即可。
B
有 login 就将一个状态变量变量设为 \(1\),有 logout 就设为 \(0\)。
如果在状态变量为 \(0\) 时,访问了 private,就将答案加一。
C
直接枚举 \(i\),再暴力地 \(f_i = \sum_{j = i-k}^{i-1}f_j\)。
这里显然会超时,于是使用前缀和优化。
多出来一个 \(f_i\) 的时候,就同步更新对应前缀和 \(sum\)。于是 \(f_i=sum_{i-1}-sum_{i-k-1}\)。
D
首先将原串的 o 左右的问号改成 .。
对于剩下的问号,最小可以全部填 .,最大就将所有的问号连续段,间隔填 o。连续段长为奇数,就是第 \(1\) 位 o,第 \(2\) 位 .,……。
记最大能总共填 \(mx\) 个,最小总共填 \(mn\) 个(就是原来的 o 个数)。
如果 \(k=mn\),那么所有问号都填 .;
如果 \(k=mx\),那么对于奇数长度的问号连续段,必须要 o.o.o 这么填;对于偶数长度的问号连续段,可以 o.o.,也可以 .o.o,发现恰好都不能确定。
其他情况,就输出原串(即该是问号的,全是问号)。通过调整,能使得所有位置都不能确定(自己画一下最好)。
E
我们依次将 \(k=1,2,3...n\) 加入集合 \(S\) 中。
我们发现,答案就是与 \(S\) 中某元素一步可达,且不在 \(S\) 中的点的个数。
枚举 \(i\),及其邻域 \(\{j\}\)。如果 \(i\) 在之前被算进过贡献,此时 \(i\) 不用删去了,将将贡献减一。再将 \(j\) 算进贡献就行,注意不要算重。
无解也很好判,使用并查集,每次将 \(i\) 与其邻域所有点 merge,如果 \(1\) 所在的集合的大小不为 \(i\),那么从 \(1\) 不能走到 \(2 \sim i\) 的所有点,亖。
F
补。
硬做。
我们希望枚举 \(i\),能快速地算出所有 \(j\) 的贡献和。
考虑直径是怎么计算的。对于两棵树,我们分别算出:
- \(l1_u\):以 \(u\) 为根的子树,从 \(u\) 延伸向下的最长路。
- \(l2_u\):以 \(u\) 为根的子树,从 \(u\) 延伸向下的次长路。注意不与 \(l1_u\) 有公共边。
- \(up_u\):以 \(u\) 为根的子树外,从 \(u\) 延伸出的最长路。
- \(val_u=\max(l1_u, up_u)\),即从 \(u\) 向任意方向延伸的最长路。
第一棵树的直径 \(D1\) 就是 \(\max_{i}\{d1_i + d2_i\}\),第二棵树 \(D2\) 同理。
显然连边后,新树直径不小于 \(D=\max(D1, D2)\)。
我们枚举 \(i\),其答案就是 \(\sum_j{\max(D, val_i+1+val_j)}=n2 \cdot D+\max(0, val_j - (D-val_i-1))\)。
这里 \(p=D-val_i-1\) 是定值,套路地,我们需要查询大于等于 \(p\) 的所有 \(val_j\) 之和,减去大于等于 \(p\) 的个数乘上 \(p\)。
弄两个桶记录一下就行。
时间复杂度 \(O(n1+n2)\)。
G
模板题。
二分一个距离 \(D\),将绿点和蓝点距离小于等于 \(D\) 的连边。然后判定是否有存在一个二分图匹配。
流一下,或者匈牙利都可以做。

浙公网安备 33010602011771号