2019暑期金华集训 Day7 分治

自闭集训 Day7

分治

主定理

由于我沉迷调题,这个地方没听课。

某些不等式

咕了

nth_element

使用快速排序的思想,选一个中间点,看左右有多少个。

期望复杂度\(O(n)\)

首先把一个序列分成5份,每份大小\(n/5\),叠成一个矩阵,对每一列进行排序。

现在中间一行就是每一列的中位数,递归下去求它的中位数。

然后把中位数比他小的列放左边,比他大的放右边。

于是我们知道至少\(0.3n\)比他小/比他大,也就是至多\(0.7n\)比他小/比他大。

于是我们找到了一个比较好的轴点,用上面的方法分治下去。

然后就\(T(n)=T(0.2n)+T(0.7n)+O(n)=O(n)\)

但这个算法常数巨大……

CF958E3

首先有结论:任意\(2n\)个点都存在合法方案。

为什么?考虑某个不合法方案的交叉,可以把边扭一下,于是总长度会变小。又因为总长度不可能无限减小,于是就有了。

然后怎么求答案呢?

咕了

CF429D

明眼人一眼就看出这是个距离的形式,然后就变成平面最近点对了……

我可能就是瞎……

CF938G

裸线段树分治+并查集+线性基。

某题

点数减边数裸题。

显然对于一个点集,满足条件的点\(u\)构成一个连通快(即一棵树),又因为树的点数减边数为1,所以直接统计即可。

CF1010F

怎么就讲过了啊/kk

\(b_i=w_i-\sum_v w_v\),于是条件等价于\(b_i\ge 0​\)

对于一个合法连通块,\(\sum b_i=X\)

于是就可以开始对\(b_i\)计数了。

于是只要定下了连通块大小为\(m\),方案数就是\({X+m-1\choose m-1}\)

于是就转化为原来的一道题了,就做完了。

某题

支持动态加有向边、查询相互可达的\((u,v)\)个数。

我们发现动态维护强连通分量似乎非常不可做,所以可以对于每一条边\((u,v)\),判断\(u,v\)什么时候会在同一个强连通分量里面。

显然这个东西满足单调性,但数据范围不允许我们挨个二分,所以我们使用整体二分。

定义函数\(solve(l,r,ql,qr)\)表示已知\([ql,qr]\)里面的边的时间都在\([l,r]\)里面,现在要求出每条边的时间。

二分一个\(mid=(l+r)/2\),然后把\([1,mid]\)里面的边都加进图里跑tarjan,这是最暴力的方法,显然过不了。但是我们注意到只要在递归\([l,mid]\)之后不把边清空,就可以只加\([l,mid]\)的边,然后用并查集缩一下点,复杂度就对了。

某题

做过,但咕了!

考虑把起点从上到下走,维护最短路树,那么可以感受到树上的父亲一定是从上变成左,再变成下,最多变两次。

然后如果一条边在\([l,r]\)没有变,那么可以缩起来。

于是就整体二分然后???

离线求逆元

求一个前缀积,然后大家都会。

树上并查集

树上分块+四毛子。

(四毛子似乎是一个叫做四个俄罗斯人的算法?)

然后就做到线性了??

咕了

Trajan LCA

离线lca,用树上并查集可以优化至\(O(n)\)

转载于:https://www.cnblogs.com/p-b-p-b/p/11305283.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值