菜是原罪
T1
脑抽考场写了一个
l
o
g
2
log^2
log2的…结果跑的莫名很快??
注意到对于一条边
(
x
,
y
)
(x,y)
(x,y),默认
x
x
x是
y
y
y的父亲,那么一个点在
y
y
y子树内另一个点在
y
y
y子树外的边会有害于
(
x
,
y
)
(x,y)
(x,y)
写成DFS序就是
i
n
[
x
]
<
=
u
<
=
o
t
[
x
]
in[x]<=u<=ot[x]
in[x]<=u<=ot[x]且
v
<
i
n
[
x
]
v<in[x]
v<in[x]或
v
>
o
t
[
x
]
v>ot[x]
v>ot[x]
用线段树维护DFS序,每个节点管理区间
[
L
,
R
]
[L,R]
[L,R]中包含了dfs序在
[
L
,
R
]
[L,R]
[L,R]的二元组
(
u
,
v
)
(u,v)
(u,v)
注意按
v
v
v的大小排序
这样一次删除的就是连续一段,那么就可以
n
l
o
g
n
nlogn
nlogn了
**T2
这种点分套FFT的玩法…恕我菜了
首先统计路径个数上个点分
那么就考虑怎么算答案了
默认左括号
(
(
(为
−
1
-1
−1,右括号
)
)
)为
1
1
1
那么自然一条路径拆成
x
−
>
L
C
A
−
>
y
x->LCA->y
x−>LCA−>y,我们知道
x
−
>
L
C
A
x->LCA
x−>LCA这段会留下一些左括号,
L
C
A
−
>
y
LCA->y
LCA−>y这一段会留下一些右括号
左右括号留下的个数是相同的,不妨设为
s
u
m
sum
sum
那么接下来只需要统计和变为
0
0
0的次数了
如果能处理出一个
s
1
[
i
]
s1[i]
s1[i]和
s
2
[
i
]
s2[i]
s2[i]分别表示从一个点到LCA和变为了
i
i
i次零与LCA到另一个点和变为了
i
i
i次零,那么其实答案算法就是一个卷积
a
n
s
[
k
]
+
=
∑
s
1
[
i
]
∗
s
2
[
k
−
i
−
1
]
ans[k]+=\sum s1[i]*s2[k-i-1]
ans[k]+=∑s1[i]∗s2[k−i−1]
注意如果留下的个数为0那么不需要后面那个减一
问题就变成了要你求这个
s
1
s1
s1与
s
2
s2
s2
搜的时候记录一个
n
o
w
now
now和
S
S
S分别表示当前遗留下来了多少个括号,以及从下往上/从上往下以及可以分成
S
S
S段,顺便记录一个
s
u
m
sum
sum表示还需要多少个什么括号才能组成一段
注意如果左边左括号超了的话,那么这个括号肯定是遗留的,把sum清零避免他和一个不能组成合法序列的右括号配对
T3
原题来自bzoj3308
两个结论:
1:所有数都只会由最多两个质因子构成
2:一个小于
N
\sqrt N
N,一个大于
N
\sqrt N
N
那么图左边放小于的质因子,右边放大于的质因子
先默认选择了所有质数,把他们都调到最大
然后连边,边权赋为他们两个在一起能获得的最大数减去他们两个的收益
如果边权为负那么就不需要连边了
然后费用流即可