ARC115 & CF709 题解
两场时间相同就并起来写了
还是 ARC 好啊
ARC012
A
显然 (i,j) 不可能当且仅当 bitcount(ai⊕aj)=2k(k∈Z),分讨一下发现后面这个满足当且仅当 bitcount(ai) 和 bitcount(aj) 的奇偶性相同。
B
无解随便判:令 Ai=ci,1−a1, Bj=c1,j−b1, ai=a1+Ai, bj=b1+Bj,那么若 ci,j≠c1,1+Ai+Bj 则无解。否则考虑 a1 和 b1 的取值,要保证所有 ai 和 bj 非负,mna=max(0,max(−Ai)), mnb=max(0,max(−Bi)),若 mna+mnb>c1,1 则无解,否则取 a1=mna 即可。
C
我是煞笔,直接写了个 O(n√n+nlog2n) 的二分 + 线段树,取 mex,好在 at 评测姬快如闪电。
正解有点小妙,将 ai 设为 i 的质因数个数(重复算多个),这样一定满足 ai的因数<ai。
D
首先如果是树的话,k 为奇数无解,否则看作两两配对,答案就是 (nk);图呢答案就是 2m−(n−1)(nk)。
因为选一条非树边,有几种情况:
- 如果连接两个黑点,这俩原先配对的就断了,变成他俩用这条非树边彼此配对
- 如果连接两个白点,可以先让这俩在树上路径上配对变黑,再用非树边让他俩变白
- 连接一黑一白,直接还是合法的
多个连通块,背包一下就好。
E
dpi,j 表示到第 i 个,与其同色的有 j 个。dpnxt,j+nxt−i−1+=dpi,j∗mink∈[i+1,nxt](ak)
每个元素都有两种去处,一是归入已有块,二是自成一块。考虑单调栈维护已有块,越往前最小值一定是递减的,有元素进栈时就推平一块儿地顺便合并被推平块,成为新块,新块的值是推平块的值之和。
F
咕咕?
CF709
A
⌈m2⌉ 意味着即使有不合法的小朋友也只有一个。于是先随便选,若不合法则在有选择余地的天里换人。
记录 xml 的手贱瞬间:换的是不合法小朋友被选中的那些天啊喂!
B
每次删除不会对其他位置造成影响。链表即可?不过我用的并查集。
C
用线段树——烦了!往前走,最小值递减,于是维护每个块的 max(dpi−1)。当前块有两种选择:
- 归入上一块,即 dpi=dpstktop−1
- 新成一块,即 dpi=Mxtop+bi
一个简单的单调栈就 AC 辣,是不是很奈思?
code
1 |
|
D
对于某对 (u,v,l),(x,y) 合法当且仅当 disu,x+vx,y+vy,v≤l
枚举 u, x, y,(x,y) 合法当且仅当 disu,x+vx,y≤max(l−vy,v)
就做完了?大水题,真的是 div1 的 D 嘛。。
E
咕咕
F
ACAM。广义 SAM 怎么做啊?
sj 在 si 中出现,一定 |sj|≤|si|。我们枚举 i 和 i 中 j 出现位置的右端点 k,
sj 一定是右端点为 k 的左端点最小的串。j 是好确定的——就是在 ACAM 上跑 si 的时候,距离 k 最近的整串位置。然后右端点在 [k+1,|si|] 的串的最小左端点还要大于 k−|sj|+1。
sj 对 si 有贡献,当且仅当其在 si 中出现的次数 = 不被其他 si 中出现串包含的出现次数(有点绕),左边这个用 BIT 维护 dfs 序,右边那个直接做就好啦。
O((∑|si|)log(∑|si|))
ACAM 虽然没有 SAM 功能多,但处理模式匹配、部分子串问题就简洁许多。