
CDQ
huanzhizun
这个作者很懒,什么都没留下…
展开
-
hdu 5739 Fantasia (2016多校第二场1006)
本人解法是CDQ+并查集。折半的时候我们用非路径压缩的并查集来维护,但是需要用深度来维护并查集使得复杂度减小很多,接下来就先连后一半的边然后分治前一半,然后撤销后一半的边,然后枚举前一半然后递归后一半#include#include#include#includeusing namespace std;const int maxn=200005;const int mod=10原创 2016-07-23 10:50:13 · 479 阅读 · 0 评论 -
hdu 5730 Shell Necklace(2016多校第一场)FFT+分治
dp[i]=sigma(dp[j]*a[i-j])具有多项式形式可以考虑fft,但是直接会T,考虑cdq分治,每次分治时跑fft即可#include #include#include#include#includeusing namespace std ;typedef long long LL ;#define clr( a , x ) memset ( a , x ,原创 2016-07-20 15:13:14 · 1806 阅读 · 0 评论 -
hdu 5808 Price List Strike Back 分治
考虑分治,对于横跨中点的我们用dp处理,dp[i][j]表示从mid到i里面和为j的最大值里的最小值,dp1[i][j]表示从mid+1到i里面和为j的最大值的最小值,然后判断一下max(dp[l][j],dp1[r][s-j])时候小于等于c即可。#include#include#include#include#includeusing namespace std;const i原创 2016-08-08 21:01:05 · 438 阅读 · 0 评论 -
bzoj 4237: 稻草人 树状数组+分治
分治的时候我们只需要右上点在右半个,左下点在左半个即可,然后左边每个点可以用set求出它所能贡献的y的区间,对于右半边可以求出他能取到的区间,然后排个序用two points+树状数组维护一下即可。#include #include #include #include #include #include#includeusing namespace std;typedef pa原创 2016-08-08 21:03:43 · 528 阅读 · 0 评论 -
bzoj 4025: 二分图 (分治+图论)
我们注意到如果出现奇环就爆炸,所以我们维护并查集即可,但是如果要连u,v我们考虑u、v到根的距离分别为x,y如果(x+y)%2==0那么根直接合并,但是如果是奇数那么久新建一个点变成x和y的父亲,注意用深度维护平衡。#include #include #include #include #include #include #include #include #include原创 2016-08-09 21:26:31 · 574 阅读 · 0 评论