点分治
gjghfd
这个作者很懒,什么都没留下…
展开
-
bzoj2599 [ IOI2011 ] -- 点分治
令ans[i]表示权值和等于k的路径条数,然后点分治就可以了。 具体看代码。 代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 200010 8 #define INF 2147483647 9 inline int Min(int x,i原创 2017-05-26 16:45:02 · 255 阅读 · 0 评论 -
bzoj2117 [ 2010国家集训队 ] -- 点分树+二分答案
考虑点分树。 求出每个重心所管辖的范围内的每个点到它的距离,建成点分树。 查询时二分答案,然后问题就转化为求到x的距离 在点分树上暴力往上跑就行了,注意去重。 时间复杂度:O(nlog3n) 代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace原创 2017-05-26 16:43:51 · 288 阅读 · 0 评论 -
bzoj2006 [ NOI2010 ] && bzoj3784 --点分治+线段树+堆
bzoj2006: 定义一个四元组{x,l,r,w},表示左端点在x,右端点在[l,r]的超级和弦的最大美妙度在将w作为右端点时取到,w可以用前缀和+线段树/ST表求出。 对于每个i,我们将{i,i+L-1,i+R-1,w}放入一个大根堆中,每次取出美妙度最大的一个加到答案中,并将{i,l,w-1,x},{i,w+1,r,x}放入堆中。 这样就相当于将左端点在i、右端点在w的超级和弦去掉。做k次就原创 2017-05-26 16:42:32 · 421 阅读 · 0 评论 -
codeforces293E Close Vertices -- 点分治+树状数组
题目大意: 给出一棵树,每条边有权值,求经过少于l条边,权值和少于w的路径总数。 点分治。每次求出所有点到重心的距离,按w排序,然后维护一个树状数组,记录经过的边 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 inline char nc(){ 7 static char原创 2017-05-26 16:42:19 · 247 阅读 · 0 评论 -
bzoj3672 [ NOI2014 ] -- 树上CDQ分治 + 斜率优化DP
神题题解代码#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 200010 #define Eps 1e-15 #define ll long long inline char nc(){ static char buf[100000原创 2017-09-21 20:32:41 · 301 阅读 · 0 评论 -
[ 点分治 ] BZOJ4675
可以发现 33 个人间互不影响。 假设共有 mm 对幸运数,那么选 xx 个点所得幸运数对数的期望即为 x(x−1)2⋅2mn(n−1){x(x-1)\over 2}·{2m\over {n(n-1)}} 用点分治求出有多少对幸运数就好了。#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> usin原创 2018-01-03 18:46:50 · 332 阅读 · 0 评论