day3 #526 div1(CF1083)
A 1800
非常水的树形DP,说是取一条简单路径,其实就是枚举lca就可以了,枚举lca然后计算最大值子树路径和次大值子树路径的和+lca的权值,就可以了
B 2000
非常水的一个贪心,显然到了第i位能有几个不同的前缀就用几个,然后大于k就对k取min即可,1~i构成的二进制数中间有多少个数?显然用类似快读的方法就可以计算了
C 2900
一个非常神奇的线段树,首先题目保证了每种权值都会出现,然后如果mex是x,肯定有一个简单路径上包含了 1 1 1 ~ x − 1 x-1 x−1,所以可以考虑二分这个x,那么有没有简单路径,可以用线段树来进行信息合并,我们定义f[l,r]=(u,v)表示 u → v u\rightarrow v u→v的简单路径是最短的包含 l l l~ r r r之间所有数字的路径,那么比如f[l,mid]和f[mid+1,r]的合并,就是枚举四个端点中的任意两个,尝试是否能使另外两个在这两个点之间的简单路径上,如果可以就合并,不行就gg,每次交换的话,实质上就是把f[l,l]换成(inv[r],inv[r]),f[r,r]换成(inv[l],inv[l]),相当于两个单点修改,而查询就是在线段树上二分一个最大的f[0,x]
D 3500
人生成就不来,溜了溜了
E 2400
先按照x坐标排个序,显然如果y坐标递增,老的就会被新的包含,然后选哪个就很麻烦,幸好题目保证了不会存在两个矩形存在包含关系,所以考虑递减就行了,那么若想选第i个矩形,假设从之前第j个转移,
d
p
[
i
]
=
d
p
[
j
]
+
(
x
[
i
]
−
x
[
j
]
)
∗
y
[
i
]
−
v
a
l
[
i
]
dp[i]=dp[j]+(x[i]-x[j])*y[i]-val[i]
dp[i]=dp[j]+(x[i]−x[j])∗y[i]−val[i],所以
d
p
[
i
]
=
m
a
x
{
d
p
[
j
]
−
x
[
j
]
∗
y
[
i
]
}
+
x
[
i
]
∗
y
[
i
]
−
v
a
l
[
i
]
dp[i]=max\{dp[j]-x[j]*y[i]\}+x[i]*y[i]-val[i]
dp[i]=max{dp[j]−x[j]∗y[i]}+x[i]∗y[i]−val[i],那么假设决策点为
j
j
j,要最大化的是
d
p
[
i
]
dp[i]
dp[i],所以把上式转化为
d
p
[
j
]
(
y
)
=
y
[
i
]
(
k
)
∗
x
[
j
]
(
x
)
+
(
d
p
[
i
]
−
x
[
i
]
∗
y
[
i
]
+
v
a
l
[
i
]
)
(
b
)
dp[j](y)=y[i](k)*x[j](x)+(dp[i]-x[i]*y[i]+val[i])(b)
dp[j](y)=y[i](k)∗x[j](x)+(dp[i]−x[i]∗y[i]+val[i])(b)
显然斜率优化维护一个下凸壳,然后观察怎么样的斜率会被弹,假设j<k且k优于j,则
d
p
[
j
]
−
x
[
j
]
∗
y
[
i
]
<
d
p
[
k
]
−
x
[
k
]
∗
y
[
i
]
dp[j]-x[j]*y[i]<dp[k]-x[k]*y[i]
dp[j]−x[j]∗y[i]<dp[k]−x[k]∗y[i]
移项得
d
p
[
k
]
−
d
p
[
j
]
x
[
k
]
−
x
[
j
]
>
y
[
i
]
\frac{dp[k]-dp[j]}{x[k]-x[j]}>y[i]
x[k]−x[j]dp[k]−dp[j]>y[i]
也就是只要队首前两个满足斜率>y[i]就可以直接弹队首了
然后他保证了y递减,所以可以直接做
F 3400
人生成就不来,溜了溜了