ARC101E - Ribbons on Tree
好菜啊,不会做。。。
容斥树形
d
p
dp
dp,设
f
[
x
]
[
k
]
f[x][k]
f[x][k]为以
x
x
x为根的子树,上面大小为
k
k
k的连通块没有匹配。
首先一个大小为
n
n
n的子树的自由完全匹配方案我们先预处理出来。
转移的话对于一个
x
x
x考虑那些边是一定不选的的,不选的边的边数为
T
T
T的话,容斥系数为
−
1
∣
T
∣
-1^{|T|}
−1∣T∣
对于一个
x
x
x的子节点
y
y
y,
那么就是分两种转移,一种是当前这条边选择,那么直接合并两个块。
如果不选择,那就是
y
y
y这个子树中自由完全匹配。
ARC100E - Or Plus Max
做一个类似与快速莫比乌斯变换的过程,对每个 i i i取一个最大值和一个次大值相加即可。
ARC100F - Colorful Sequences
好菜啊,不会做。。。
考虑用总包含
m
m
m这个序列的方案数减去不合法的。
总方案数首先是:
(
n
−
m
+
1
)
k
n
−
m
(n-m+1)k^{n-m}
(n−m+1)kn−m
然后分情况讨论。
对于这个序列本身就是一个合法的序列,那么不合法的方案数为
0
0
0。
对于这个序列是一个每个元素互不相同的序列,考虑
d
p
dp
dp。
设
f
[
i
]
[
j
]
f[i][j]
f[i][j]为长度为
i
i
i的序列后面
j
j
j个数各不相同,下一个数就会出现重复,
d
p
dp
dp过程中保证
j
<
m
j < m
j<m即可。
转移就是讨论新加入的这个元素是全新的还是跟前面出现重复的。
对于剩下的情况,那么就是只用考虑前面的一段和后面的一段即可。
改一下初始值,跟上面做个类似的
d
p
dp
dp。
ARC099E - Independence
口胡一下。
大概就是在补图上跑个二分图染色再做一下背包就好了。
ARC099F - Independence
可以
H
a
s
h
Hash
Hash来做。
每次在
S
S
S前面加入一个字符,相当于:
+
+
+:
H
a
s
h
Hash
Hash值加
1
1
1
−
-
−:
H
a
s
h
Hash
Hash值减
1
1
1
>
>
>:
H
a
s
h
Hash
Hash值乘上一个
B
a
s
e
Base
Base
<
<
<:
H
a
s
h
Hash
Hash值除上一个
B
a
s
e
Base
Base
然后就可以用个
m
a
p
map
map来搞搞了。
Tenka1 Programmer Contest 2019
D
你可以考虑用不合法的减去合法的。
那就是相当于,如果
C
C
C为最大的集合,
A
+
B
−
C
<
=
0
A+B-C<=0
A+B−C<=0。
你就可以直接设一维为
A
+
B
−
C
A+B-C
A+B−C,然后就可以直接
d
p
dp
dp了。
E
首先所有
a
i
a_i
ai的公因数可以成为答案。
然后
f
(
i
)
≡
0
(
m
o
d
p
)
f(i)≡0(mod \ p)
f(i)≡0(mod p),那么该多项式肯定满足存在一个因子
(
x
−
i
)
(x-i)
(x−i)。
那么就相当于要满足存在因子
∏
i
=
0
p
−
1
(
x
−
i
)
≡
(
x
p
−
x
)
(
m
o
d
p
)
\prod_{i=0}^{p-1}(x-i)≡(x^p-x)(mod \ p)
∏i=0p−1(x−i)≡(xp−x)(mod p)
你可以发现答案肯定在
N
N
N以内,直接暴力枚举判就好了。
F
考虑枚举
0
0
0的个数。
设和为
S
S
S,有三种情况。
1.
S
≤
X
1.S\leq X
1.S≤X
2.
(
S
−
X
)
2.(S-X)
2.(S−X)为奇数,序列仅有
2
2
2。
3.
(
S
−
X
)
3.(S-X)
3.(S−X)为奇数,任意一个
1
1
1,左边的和加上
1
1
1不超过
X
X
X,右边的和加上
1
1
1不超过
X
X
X。
然后你枚举一下
S
S
S,搞一搞就好了。
ARC097E - Sorted and Sorted
设
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]为已选了
i
i
i个白色,和
j
j
j个黑色。
设
w
[
i
]
[
j
]
w[i][j]
w[i][j]为第
i
i
i个白色后面有多少个
1
1
1~
i
i
i中的白色,有多少个
1
1
1 ~
j
j
j中的黑色,
b
[
i
]
[
j
]
b[i][j]
b[i][j]同理。
那么转移就是
f
[
i
]
[
j
]
=
m
i
n
(
f
[
i
−
1
]
[
j
]
+
w
[
i
]
[
j
]
,
f
[
i
]
[
j
−
1
]
+
b
[
i
]
[
j
]
)
f[i][j]=min(f[i-1][j]+w[i][j],f[i][j-1]+b[i][j])
f[i][j]=min(f[i−1][j]+w[i][j],f[i][j−1]+b[i][j])
ARC094E - Tozan and Gezan
设满足
A
i
>
B
i
A_i > B_i
Ai>Bi的点的最小值为
C
C
C。
直接输出
∑
i
=
1
n
B
i
−
C
\sum_{i=1}^nB_i-C
∑i=1nBi−C即可,挺显然的。
ARC094F - Normalization
打了个表发现,对于长度大于三的有规律,
对于一个串
S
S
S他能变换到的串
T
T
T满足:
1.
T
1.T
1.T的
s
u
m
sum
sum和
S
S
S的
s
u
m
sum
sum在模
3
3
3意义下同余。
2.
T
2.T
2.T至少有一对相邻的数是相同的,或者是这个串本身。
搞一个
d
p
dp
dp就完事了。
证明的话,可以用归纳???
AGC005E - Sugigma: The Showdown
好菜啊,并不会做。。。
有一个结论是
A
A
A选手假设走到了红树的一条边
(
x
,
y
)
(x,y)
(x,y)在蓝树上满足
d
i
s
(
x
,
y
)
>
2
dis(x,y) > 2
dis(x,y)>2,那么答案就是
−
1
-1
−1。
假设以
B
B
B选手的起始位置为根建出一颗蓝树,可以发现,
A
A
A选手的走法肯定是一直往下跑,然后跑到一个位置后原地等死。
那么就可以找出
A
A
A选手能往下拓展并且不被
B
B
B抓到的最深的深度,就是答案了。
然后跑两个
d
f
s
dfs
dfs就行了。
AGC005F - Many Easy Problems
考虑一个点
x
x
x对某一个
k
k
k的贡献。
容斥一下可得:
C
n
k
−
∑
f
a
[
y
]
=
x
C
t
o
t
[
y
]
k
−
C
n
−
t
o
t
[
x
]
k
C_n^k-\sum_{fa[y]=x}C_{tot[y]}^k-C_{n-tot[x]}^k
Cnk−fa[y]=x∑Ctot[y]k−Cn−tot[x]k
就可以
N
T
T
NTT
NTT了。
AGC032
B
我的做法是乱搞的。
就是你把点的和搞一个最小的约数,以这个约数作为块数,就A了。
C
一开始以为是找到任意三个环,但实际上是问你整个图能不能分成三个环。
那么,首先如果有某个点的度数是奇数,肯定就是不行的。
然后如果有点的个数大于等于六,就一定OK。
否则,如果有三个及以上的四度数的点,也OK。
如果只有两个呢?
可能是不行的,唯一的一种情况就是:
判一下就好了。
D
我是这么想的,就是每个点其实最多只会移一次,某些点可能是不会动的。
那么我们可以考虑设这样的状态:
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]当且
d
p
dp
dp到第
i
i
i位,编号为j的作为最后一个不动的点,那么就可以得到这样的转移:
d
p
[
i
]
[
j
]
=
m
i
n
(
d
p
[
i
]
[
j
]
,
f
[
i
−
1
]
[
j
]
+
A
)
,
d
p
[
i
]
[
a
[
i
]
]
=
m
i
n
(
d
p
[
i
]
[
a
[
i
]
]
,
d
p
[
i
−
1
]
[
j
]
)
,
a
[
i
]
>
j
dp[i][j]=min(dp[i][j],f[i-1][j]+A),dp[i][a[i]]=min(dp[i][a[i]],dp[i-1][j]),a[i]>j
dp[i][j]=min(dp[i][j],f[i−1][j]+A),dp[i][a[i]]=min(dp[i][a[i]],dp[i−1][j]),a[i]>j
分别表示继续以j为不动,那么
a
[
i
]
a[i]
a[i]往右移,以
a
[
i
]
a[i]
a[i]为不动,则不需要新的移动。
d
p
[
i
]
[
j
]
=
m
i
n
(
d
p
[
i
]
[
j
]
,
d
p
[
i
−
1
]
[
j
]
+
B
)
,
a
[
i
]
<
j
dp[i][j]=min(dp[i][j],dp[i-1][j]+B),a[i]<j
dp[i][j]=min(dp[i][j],dp[i−1][j]+B),a[i]<j
这种情况下,
a
[
i
]
a[i]
a[i]无法作为不动,只能往左移。
E
首先就是说可以找到一个分界点
m
i
d
mid
mid使得
(
1
−
m
i
d
,
2
−
m
i
d
−
1...
)
(1-mid,2-mid-1...)
(1−mid,2−mid−1...)配对,且每一组配对和小于
M
M
M,大于等于的部分也是头尾配对。
我觉得题解的图挺好的,搬来,其中蓝色线表示小于
M
M
M的配对,红色则为大于等于
M
M
M的配对。
F
这道题挺有意思的。
首先随便切一刀红色的边,然后再顺
120
120
120度切一个绿的边,然后再逆
120
120
120度切一个蓝色的。
然后最小的角就是距离最小的颜色不相同相邻直线,令第一次划分为0,则也相当于求
⌊
0
,
1
/
3
)
\lfloor 0,1/3)
⌊0,1/3)距离最小的颜色不相同相邻直线,除去第一次划分,一共有
n
−
1
n-1
n−1个点,把这个角分成了
n
n
n块。
考虑求一个
f
(
i
)
f(i)
f(i)表示分成
i
i
i个颜色块的方案数,这个可以递推。
然后考虑求出分成
i
i
i段的期望最小段
g
(
i
)
g(i)
g(i),分成
i
i
i段的期望长度是
i
3
n
\frac i{3n}
3ni。
g
(
i
)
=
i
3
n
∫
t
=
0
1
i
P
(
m
i
n
>
=
t
)
d
t
=
i
3
n
∫
t
=
0
1
i
(
1
−
i
t
)
i
−
1
d
t
=
i
3
n
∫
t
=
0
1
t
i
−
1
i
d
t
=
1
3
n
i
g(i)=\frac i{3n}\int_{t=0}^{\frac 1i}P(min>=t)dt=\frac i{3n}\int_{t=0}^{\frac 1i}(1-it)^{i-1}dt=\frac i{3n}\int_{t=0}^1\frac {t^{i-1}}idt=\frac 1{3ni}
g(i)=3ni∫t=0i1P(min>=t)dt=3ni∫t=0i1(1−it)i−1dt=3ni∫t=01iti−1dt=3ni1
答案就等于
∑
i
=
1
n
f
(
i
)
g
(
i
)
\sum_{i=1}^nf(i)g(i)
∑i=1nf(i)g(i)