Processing math: 100%


ARC115 & CF709 题解

两场时间相同就并起来写了

还是 ARC 好啊

ARC012

A

显然 (i,j) 不可能当且仅当 bitcount(aiaj)=2k(kZ),分讨一下发现后面这个满足当且仅当 bitcount(ai)bitcount(aj) 的奇偶性相同。

B

无解随便判:令 Ai=ci,1a1, Bj=c1,jb1, ai=a1+Ai, bj=b1+Bj,那么若 ci,jc1,1+Ai+Bj 则无解。否则考虑 a1b1 的取值,要保证所有 aibj 非负,mna=max(0,max(Ai)), mnb=max(0,max(Bi)),若 mna+mnb>c1,1 则无解,否则取 a1=mna 即可。

C

我是煞笔,直接写了个 O(nn+nlog2n) 的二分 + 线段树,取 mex,好在 at 评测姬快如闪电。

正解有点小妙,将 ai 设为 i 的质因数个数(重复算多个),这样一定满足 ai<ai

D

首先如果是树的话,k 为奇数无解,否则看作两两配对,答案就是 (nk);图呢答案就是 2m(n1)(nk)

因为选一条非树边,有几种情况:

  1. 如果连接两个黑点,这俩原先配对的就断了,变成他俩用这条非树边彼此配对
  2. 如果连接两个白点,可以先让这俩在树上路径上配对变黑,再用非树边让他俩变白
  3. 连接一黑一白,直接还是合法的

多个连通块,背包一下就好。

E

dpi,j 表示到第 i 个,与其同色的有 j 个。dpnxt,j+nxti1+=dpi,jmink[i+1,nxt](ak)

每个元素都有两种去处,一是归入已有块,二是自成一块。考虑单调栈维护已有块,越往前最小值一定是递减的,有元素进栈时就推平一块儿地顺便合并被推平块,成为新块,新块的值是推平块的值之和。

F

咕咕?

CF709

A

m2 意味着即使有不合法的小朋友也只有一个。于是先随便选,若不合法则在有选择余地的天里换人。

记录 xml 的手贱瞬间:换的是不合法小朋友被选中的那些天啊喂!

B

每次删除不会对其他位置造成影响。链表即可?不过我用的并查集。

C

用线段树——烦了!往前走,最小值递减,于是维护每个块的 max(dpi1)。当前块有两种选择:

  1. 归入上一块,即 dpi=dpstktop1
  2. 新成一块,即 dpi=Mxtop+bi

一个简单的单调栈就 AC 辣,是不是很奈思?

code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <bits/stdc++.h>
#define rep(i, x, y) for (int i = x; i <= y; i++)
using namespace std;

typedef long long ll;
const int N = 3e5 + 10;
ll n, h[N], b[N], dp[N], top, stk[N], Mx[N], f[N];

void cmax(ll &x, ll y) { x = max(x, y); }

int main() {
cin >> n;
rep(i, 1, n) scanf("%lld", &h[i]);
rep(i, 1, n) scanf("%lld", &b[i]);
dp[0] = -1e18;
dp[1] = b[1];
stk[top = 1] = 1;
Mx[1] = 0;
rep(i, 2, n) {
ll mx = dp[i - 1];
while (top && h[stk[top]] >= h[i]) {
cmax(mx, Mx[top]);
--top;
}
stk[++top] = i;
Mx[top] = mx;
dp[i] = max(dp[stk[top - 1]], mx + b[i]);
}
printf("%lld\n", dp[n]);
return 0;
}

D

对于某对 (u,v,l)(x,y) 合法当且仅当 disu,x+vx,y+vy,vl

枚举 u, x, y(x,y) 合法当且仅当 disu,x+vx,ymax(lvy,v)

就做完了?大水题,真的是 div1 的 D 嘛。。

E

咕咕

F

ACAM。广义 SAM 怎么做啊?

sjsi 中出现,一定 |sj||si|。我们枚举 iij 出现位置的右端点 k
sj 一定是右端点为 k 的左端点最小的串。j 是好确定的——就是在 ACAM 上跑 si 的时候,距离 k 最近的整串位置。然后右端点在 [k+1,|si|] 的串的最小左端点还要大于 k|sj|+1

sjsi 有贡献,当且仅当其在 si 中出现的次数 = 不被其他 si 中出现串包含的出现次数(有点绕),左边这个用 BIT 维护 dfs 序,右边那个直接做就好啦。

O((|si|)log(|si|))

Code

ACAM 虽然没有 SAM 功能多,但处理模式匹配、部分子串问题就简洁许多。