
树分治
文章平均质量分 79
huanghongxun
这个作者很懒,什么都没留下…
展开
-
BZOJ 4012 HNOI 2015 开店 动态点分治
多次询问给定点到点权在[l,r][l,r]间的所有点距离之和。询问某个点x到其他点的距离之和,可以考虑其到根的路径上的点,发现其和可以表示为(为了简单表示,令c[x]表示x所在子树内的所有点) c[x]到x的距离和+ {c[fa[x]]-c[x]}到fa[x]的距离和+|{c[fa[x]]-c[x]}|*dis(x,fa[x])+ …. c[fa[x]]-c[x]表示x的父亲的子树的所有点除原创 2016-04-03 00:10:45 · 1074 阅读 · 0 评论 -
BZOJ 3648|寝室管理|点分治|树状数组|平衡树
给出一个至多有1个环的图,求长度不超过K的路径数。考虑树的情况,显然用点分治就可以搞出来了。 对于过根的路径,先处理出各深度有多少的点,再依次枚举各子树,对于各点,有其深度,问题变成了在其他子树中,与现有深度之和不超过K的有多少个,而枚举的点到根的距离是已知的t,那么就变成在之前的子树中,深度不超过K-t的点有多少个,平衡树、树状数组都可以轻易地维护。O(nlog2n)O(n\log^2 n)环呢原创 2016-04-29 09:53:59 · 1059 阅读 · 0 评论 -
BZOJ 3784|树上的路径|点分治|堆|RMQ
求前M个路径,使路径权最小。和NOI 2010 超级钢琴类似。。。#include <queue>#include <cstdio>#include <cstring>#define FOR(i,j,k) for(i=j;i<=k;++i)const int N = 50005, M = N * 2, S = 2000005;using namespace std;int bin[20]原创 2016-04-29 12:25:46 · 739 阅读 · 0 评论 -
BZOJ 1095 ZJOI 2007 Hide 捉迷藏 动态点分治
动态点分治? 就是内存卡的很紧?用了154MB。。。 第一次写参考了PoPoQQQ大爷的代码。稍后补齐题解。。#include <queue>#include <cstdio>#include <algorithm>#define FOR(i,j,k) for(i=j;i<=k;++i)const int N = 100005, M = N * 2;using namespace st原创 2016-03-31 22:13:02 · 1082 阅读 · 0 评论 -
BZOJ 3697 采药人的路径 点分治
由于不知道两种颜色的和,但是如果将两种颜色分别设为1和-1,那么符合条件的和必为0,以这个树分治即可。 数组必须可以索引负值为了不调试使代码长了好多。。#include <queue>#include <cstdio>#include <algorithm>const int N = 100005, M = N * 2;using namespace std;struct SimpleA原创 2016-04-05 23:51:33 · 498 阅读 · 0 评论 -
HDU 4812 D Tree 点分治
见鬼了 如果把第59~60行与上面的循环合并会WA。。。 怎么想都没有问题 求教由于树链分为经过根与在子树中2种情况。 而在子树中的情况递归转化为根的情况。 而根的情况就简单了,扫一遍子树,处理出所有可能走出的乘积,然后哈希判定即可。开map好像超时了。。应该是我写的比较渣。。#include <cstdio>#include <cstring>#include <algorithm>原创 2016-04-03 16:18:06 · 678 阅读 · 0 评论 -
BZOJ 2599 IOI 2011 Race 点分治
和HDU 4812 差不多,只不过乘法换成加法而已。 http://blog.youkuaiyun.com/huanghongxun/article/details/51050786#include <cstdio>#include <cstring>#include <algorithm>#define FOR(i,j,k) for(i=j;i<=k;++i)#define ms(i) memset原创 2016-04-03 23:50:05 · 611 阅读 · 0 评论 -
POJ 1987 BZOJ 3365 USACO 2004 Feb Distance Statistics 路程统计 点分治
和POJ 1714一样。。 http://blog.youkuaiyun.com/huanghongxun/article/details/50967578#include <cstdio>#include <algorithm>#include <cstring>const int N = 40005, M = N * 2;#define adj(i,j) for(int i=h[j];i;i=p[原创 2016-04-03 18:11:57 · 614 阅读 · 0 评论 -
POJ 2114 Boatherds 点分治
和POJ 1714差不多。 问树中存在多少条路径使其长度为K。#include <cstdio>#include <algorithm>#include <cstring>const int N = 10005, M = 50005, inf = 2147483647;#define adj(i,j) for(int i=h[j];i;i=p[i])if(v[i]!=fa&&!vis[i]原创 2016-04-03 17:10:56 · 766 阅读 · 0 评论 -
POJ 1741|BZOJ 1468|Tree|树分治
求树上距离不超过K的点对数。 一条链有2种情况。 一是经过根;二是在子树中。 为了排除情况二,我们统计两端点不在同一子树中的。 可以先统计所有,再统计在同一子树中的。 于是可以对所有点距离排序,然后扫一遍统计即可。 http://blog.sina.com.cn/s/blog_6d5aa19a0100o73m.html#include <cstdio>#include <algorit原创 2016-03-23 22:55:03 · 666 阅读 · 0 评论