贪心跟个sb一样…
来cf刷几个题玩玩
注意一下**表示还要再来玩一次的
717B. R3D3’s Summer Adventure
每次拓展一个点,即从上一个最优情况来到下一个最优情况
目标就是让你建出一个字典树,满足有
n
n
n个叶子节点且叶子节点权最小
这里的贪心我们需要考虑的是每次拓展一个点,即从上一个最优情况来到下一个最优情况
听说这种拓展还有个名字叫
V
a
r
n
C
o
d
e
T
r
e
e
Varn Code Tree
VarnCodeTree…
考虑每次找到一个最小权的叶子节点
i
i
i,设他的权为
c
c
c
显然可以知道的是每次我们一定会扩展出来两个叶子节点,因为只扩展一个显然没有左右
故每次会多出两个权为
c
+
c
1
c+c1
c+c1与
c
+
c
2
c+c2
c+c2的叶子节点
模拟
n
−
1
n-1
n−1次不难得到一个
n
l
o
g
n
nlogn
nlogn的做法
考虑如何加速这个过程,我们发现在权值相同的时候显然是可以同时拓展一些叶子节点。设
f
[
i
]
f[i]
f[i]表示权值为
i
i
i的叶子节点个数,则每次取出最小的开始拓展。注意到每次节点个数的增长类似于斐波那契数列,故复杂度可以通过
注意特判掉存在某个
c
c
c为
0
0
0的情况
**538H. Summer Dichotomy
贪心考虑答案的最终位置的性质
这个题搞完了之后还是迷迷糊糊的…
可能变得不naive一点之后会再来搞一次?
这题的套路是贪心考虑答案的最终位置的性质
在不考虑
t
1
,
t
2
t1,t2
t1,t2的限制下,不妨设存在一组解
n
1
n1
n1,
n
2
n2
n2
满足
n
1
>
m
a
x
(
l
i
)
n1>max(l_i)
n1>max(li)及
n
2
<
m
i
n
(
r
i
)
n2<min(r_i)
n2<min(ri)
显然可以发现,如果出现了这种情况,我们总能往左移动
n
1
n1
n1同时往右移动
n
2
n2
n2
一定能使得两个点都贴上边界并且答案仍然合法
所以不妨设
n
1
=
m
a
x
(
l
i
)
,
n
2
=
m
i
n
(
r
i
)
n1=max(l_i),n2=min(r_i)
n1=max(li),n2=min(ri)
此时
n
1
n1
n1需要向右移动,
n
2
n2
n2需要向左移动
如果多出了
t
1
,
t
2
t1,t2
t1,t2的限制,我们发现,在
n
1
,
n
2
n1,n2
n1,n2向左与向右移动(即初始情况不满足限制)的时候,一定能够使得一个点贴上了
t
1
t1
t1或者
t
2
t2
t2的边界。并且使得答案仍然成立
故我们定值之后再对
n
1
,
n
2
n1,n2
n1,n2取边界值。然后二分图染色判定即可
1097E. Egor and an RPG game
贪心考虑不同决策时对答案的影响
其实大概想了一下如果每次贪心选最长上升或者下降序列…
因为不会求复杂度就跑了2333…可能以后写一下我这个做法?
题解做法很巧妙,用到了我忽略的
f
f
f数组
先抛出结论,设
k
k
k为满足
m
a
x
(
k
∗
(
k
+
1
)
2
<
=
n
)
max(\frac{k*(k+1)}{2}<=n)
max(2k∗(k+1)<=n)的数,则
f
[
n
]
=
k
f[n]=k
f[n]=k
考虑归纳证明
对一个长度为
n
n
n的序列,先求出其
L
I
S
LIS
LIS
如果长度
>
K
>K
>K,贪心的将其删除然后递归向下完成
注意到他减去了之后合法的
K
K
K一定不会大于
k
∗
(
k
−
1
)
2
\frac{k*(k-1)}{2}
2k∗(k−1),故对于剩下来的
n
n
n是合法的
否则,我们根据
L
I
S
LIS
LIS的结果构造下降序列
对于
L
I
S
LIS
LIS数组
g
[
i
]
g[i]
g[i]同值的,我们将其放到同一组。显然同组中数不递增,故可以用
≤
K
\leq K
≤K的次数构造完成这个序列
实现模拟上述过程即可
复杂度是非常不满的
n
n
log
n
n\sqrt n\log n
nnlogn
533A. Berland Miners
贡献 !贡献!贡献!
转化的有点慢了…
权值离散,预处理每个点到根上的最大值和次大值
注意这种匹配的题一般都是把两个序列归为一个序列,然后一个设为
+
1
+1
+1另一个设为
−
1
-1
−1,考虑后缀和不小于
0
0
0的问题
那么用线段树维护一下最小的后缀值就可以快速判合法,问题在于现在是怎么移动
用一个小小的贪心
从后往前找到第一个后缀和小于
0
0
0的位置
x
x
x,显然我们需要增大的那个点就是要增大到
x
x
x
增加少了没有作用,增加大了没有贡献
故剩余直接模拟上述过程即可