点分治模板(洛谷P4178 Tree)(树分治,树的重心,容斥原理)

时间:2023-01-13 14:55:10

推荐YCB的总结

推荐你谷ysn等巨佬的详细题解

大致流程——

  1. dfs求出当前树的重心

  2. 对当前树内经过重心的路径统计答案(一条路径由两条由重心到其它点的子路径合并而成)

  3. 容斥减去不合法情况(两条子路径在重心的子树内就已经相交)

  4. 删除重心(打上永久标记),对子树继续处理,转1

求重心是板子,算答案的方法要依题而定,一般都要容斥。

模板题洛谷传送门

calc函数中,头尾两个指针扫的计数方法也是一种套路

因为要sort,所以复杂度\(O(n\log^2n)\),不过蒟蒻实测你谷数据\(k\)不超过\(40000\),所以可以改用桶排序,复杂度降到\(O(n(\log n+\log k))\)

#include<cstdio>
#include<cstring>
#include<algorithm>
#define RG register
#define I inline
#define R RG int
#define G c=getchar()
using namespace std;
const int N=4e5+9,M=8e5+9;
int n,k,p,rt,ans,he[N],ne[M],to[M],l[M],mx[N],s[N],b[N];
bool vis[N];
I void max(R&x,R y){if(x<y)x=y;}
I int in(){
RG char G;
while(c<'-')G;
R x=c&15;G;
while(c>'-')x*=10,x+=c&15,G;
return x;
}
void getrt(R x){//求重心模板
vis[x]=1;s[x]=1;mx[x]=0;
for(R y,i=he[x];i;i=ne[i]){
if(vis[y=to[i]])continue;
getrt(y);
s[x]+=s[y];max(mx[x],s[y]);
}
max(mx[x],n-s[x]);
if(mx[rt]>mx[x])rt=x;
vis[x]=0;
}
void getd(R x,R d){//统计长度不超过k的子路径
if(d>k)return;
vis[x]=1;b[++p]=d;
for(R i=he[x];i;i=ne[i])
if(!vis[to[i]])getd(to[i],d+l[i]);
vis[x]=0;
}
I int calc(R x,R dis){//计算经过x的路径的答案
p=0;getd(x,dis);
sort(b+1,b+p+1);
R ret=0,i=1,j=p;//双指针扫描计数
while(i<=j)b[i]+b[j]>k?--j:ret+=j-i++;
return ret;
}
void div(R x){//分治流程在此函数中得到体现
getrt(x);
ans+=calc(x=rt,0);
vis[x]=1;rt=0;
for(R t=n,y,i=he[x];i;i=ne[i]){
if(vis[y=to[i]])continue;
ans-=calc(y,l[i]);
n=s[x]>s[y]?s[y]:t-s[x];
div(y);
}
}
int main(){
mx[0]=1e9;
n=in();
for(R x,y,i=1;i<n;++i){
x=in();y=in();
ne[++p]=he[x];to[he[x]=p]=y;
ne[++p]=he[y];to[he[y]=p]=x;
l[p]=l[p-1]=in();
}
k=in();
div(1);
printf("%d\n",ans);
return 0;
}

点分治模板(洛谷P4178 Tree)(树分治,树的重心,容斥原理)的更多相关文章

  1. &lbrack;洛谷P4178&rsqb; Tree &lpar;点分治模板&rpar;

    题目略了吧,就是一棵树上有多少个点对之间的距离 \(\leq k\) \(n \leq 40000\) 算法 首先有一个 \(O(n^2)\) 的做法,枚举每一个点为起点,\(dfs\) 一遍可知其它 ...

  2. 洛谷P4178 Tree &lpar;点分治&rpar;

    题目描述 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K 输入输出格式 输入格式:   N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下 ...

  3. 洛谷 P4178 Tree —— 点分治

    题目:https://www.luogu.org/problemnew/show/P4178 这道题要把 dep( dis? ) 加入一个 tmp 数组里,排序,计算点对,复杂度很美: 没有写 sor ...

  4. POJ1471 Tree&sol;洛谷P4178 Tree

    Tree P4178 Tree 点分治板子. 点分治就是直接找树的重心进行暴力计算,每次树的深度不会超过子树深度的\(\frac{1}{2}\),计算完就消除影响,找下一个重心. 所以伪代码: voi ...

  5. 2018&period;07&period;20 洛谷P4178 Tree(点分治)

    传送门 又一道点分治. 直接维护子树内到根的所有路径长度,然后排序+双指针统计答案. 代码如下: #include<bits/stdc++.h> #define N 40005 using ...

  6. 洛谷 4178 Tree——点分治

    题目:https://www.luogu.org/problemnew/show/P4178 点分治.如果把每次的 dis 和 K-dis 都离散化,用树状数组找,是O(n*logn*logn),会T ...

  7. &lbrack;洛谷P4178&rsqb;Tree

    题目大意:给一棵树,问有多少条路径长度小于等于$k$ 题解:点分治 卡点:无 C++ Code: #include <cstdio> #include <algorithm> ...

  8. 洛谷P4178 Tree &lpar;算竞进阶习题&rpar;

    点分治 还是一道点分治,和前面那道题不同的是求所有距离小于等于k的点对. 如果只是等于k,我们可以把重心的每个子树分开处理,统计之后再合并,这样可以避免答案重复(也就是再同一个子树中出现路径之和为k的 ...

  9. 洛谷 P4178 Tree

    #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #inclu ...

随机推荐

  1. Oracle直方图的详细解析

    yuanwen:http://blog.csdn.net/javacoffe/article/details/5578206 Oracle直方图解析 一.    何谓直方图: 直方图是一种统计学上的工 ...

  2. iOS进阶学习-CoreData

    一.CoreData数据库框架的优势 1.CoreData数据持久化框架是Cocoa API的一部分,首次在iOS5版本的系统中出现,它允许按照实体-属性-值模型组织数据,并以XML.二进制文件或者S ...

  3. SaltStack安装Redis模块

    安装redis Python Client 下载地址: https://pypi.python.org/simple/redis/ tar -xvf redis-2.8.0.tar.gz cd red ...

  4. 单调栈 二 nyOj 最大矩形和

    主要思想来自 http://blog.csdn.net/wuyanyi/article/details/7243580 题目的连接,头次提交的同学需要注册 http://acm.nyist.net/J ...

  5. 深入浅出--UNIX多进程编程之fork&lpar;&rpar;函数

    0前言 上周都在看都在学习unix环境高级编程的第八章--进程控制.也就是这一章中.让我理解了unix中一些进程的原理.以下我就主要依照进程中最重要的三个函数来进行解说.让大家通过阅读这一篇文章彻底明 ...

  6. 改变input标签中placeholder显示的颜色

    ::-webkit-input-placeholder { /* WebKit browsers */ color: #A9A9A9; } :-moz-placeholder { /* Mozilla ...

  7. Redmine发布新闻,自动发送邮件功能失效恢复

    问题描述:操作数据库,修改项目公开状体后,创建新闻,自动发送邮件功能失效. 问题检查和恢复测试: 1.检查管理员权限 2.重新手动配置项目公开状态,覆盖数据操作 3.对比其他正常项目数据库状态,进行恢 ...

  8. 牛客第三场多校 E Sort String

    链接:https://www.nowcoder.com/acm/contest/141/E来源:牛客网 Eddy likes to play with string which is a sequen ...

  9. 深入详解美团点评CAT跨语言服务监控(三)CAT客户端原理

    cat客户端部分核心类 message目录下面有消息相关的部分接口 internal目录包含主要的CAT客户端内部实现类: io目录包含建立服务端连接.重连.消息队列监听.上报等io实现类: spi目 ...

  10. 使用canvas制作简单表格

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...