题面要求小于等于K的路径数目,我么很自然的想到点分治(不会的就戳我)

这道题的统计答案与模板题不一样的地方是由等于K到小于等于K

那么我们可以把每一个子节点到当前根(重心)的距离排序,然后用类似双指针的方法来求小于等于K的边的数量

但是如果只是双指针统计的话,那么以下不合法的情况显然也会被算进答案:

而我们需要的合法路径是长成这样的:

所以我们需要减去上述不合法的路径,怎么减呢?

不难发现,对于所有不合法的路径,都是在当前跟的某一棵子树上的(没有跨越两个子树)

所以我们可以对当前跟节点的每一条边进行遍历,利用容斥的思想减去不合法的路径。

具体操作为:当遍历重心节点的每一个节点时,我们可以重新计算dis,然后把经过了从重心到新遍历的点的边两次的路径剪掉(就是上述不合法路径),最后统计答案即可

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define re register
#define inf 123456789
il int read()
{
re int x = 0, f = 1; re char c = getchar();
while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x * f;
}
#define rep(i, s, t) for(re int i = s; i <= t; ++ i)
#define drep(i, s, t) for(re int i = t; i >= s; -- i)
#define Next(i, u) for(re int i = head[u]; i; i = e[i].next)
#define mem(k, p) memset(k, p, sizeof(k))
#define maxn 40005
struct edge{int v, w, next;}e[maxn << 1];
int n, m, head[maxn], cnt, k, ans;
int dp[maxn], vis[maxn], sum, dis[maxn], rt, size[maxn], rev[maxn], tot;
il void add(int u, int v, int w)
{
e[++ cnt] = (edge){v, w, head[u]}, head[u] = cnt;
e[++ cnt] = (edge){u, w, head[v]}, head[v] = cnt;
}
il void getrt(int u, int fr)
{
size[u] = 1, dp[u] = 0;
Next(i, u)
{
int v = e[i].v;
if(v == fr || vis[v]) continue;
getrt(v, u);
size[u] += size[v], dp[u] = max(dp[u], size[v]);
}
dp[u] = max(dp[u], sum - size[u]);
if(dp[u] < dp[rt]) rt = u;
}
il void getdis(int u, int fr)
{
rev[++ tot] = dis[u];
Next(i, u)
{
int v = e[i].v;
if(v == fr || vis[v]) continue;
dis[v] = dis[u] + e[i].w;
getdis(v, u);
}
}
il int doit(int u, int w)
{
tot = 0, dis[u] = w, getdis(u, 0);
sort(rev + 1, rev + tot + 1);
int l = 1, r = tot, ans = 0;
while(l <= r) (rev[l] + rev[r] <= k) ? (ans += r - l, ++ l) : (-- r);
return ans;
}
il void solve(int u)
{
vis[u] = 1, ans += doit(u, 0);
Next(i, u)
{
int v = e[i].v;
if(vis[v]) continue;
ans -= doit(v, e[i].w);
sum = size[v], dp[0] = n, rt = 0;
getrt(v, u), solve(rt);
}
}
int main()
{
n = read();
rep(i, 1, n - 1){int u = read(), v = read(), w = read(); add(u, v, w);}
k = read(), dp[0] = sum = n, getrt(1, 0), solve(rt);
printf("%d", ans);
return 0;
}

P4178 Tree(点分治)的更多相关文章

  1. 洛谷P4178 Tree (点分治)

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

  2. 洛谷 P4178 Tree —— 点分治

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

  3. P4178 Tree 点分治

    思路:点分治 提交:1次 题解: 要求权值和\(\leq K\) 的路径,我们可以类比点分治的模板,把长为\(len\)是否存在,改为\(len\)的路径的条数,并用用树状数组维护前缀和,这样就可以求 ...

  4. [洛谷P4178] Tree (点分治模板)

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

  5. [Luogu P4178]Tree (点分治+splay)

    题面 传送门:https://www.luogu.org/problemnew/show/P4178 Solution 首先,长成这样的题目一定是淀粉质跑不掉了. 考虑到我们不知道K的大小,我们可以开 ...

  6. POJ1471 Tree/洛谷P4178 Tree

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

  7. luogu P4178 Tree

    题目链接 luogu P4178 Tree 题解 点分治 代码 // luogu-judger-enable-o2 #include<cstdio> #include<algorit ...

  8. 【题解】[P4178 Tree]

    [题解]P4178 Tree 一道点分治模板好题 不知道是不是我见到的题目太少了,为什么这种题目都是暴力开值域的桶QAQ?? 问点对,考虑点分治吧.直接用值域树状数组开下来,统计的时候直接往树状数组里 ...

  9. 【P4178】Tree——点分治

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

随机推荐

  1. WinForm的EXE破解(基于IL修改)

    一.目的与目标 1.1 主题目的 部门新人较多,希望通过本次分享让同学们对以下知识点有个认识: 破解原理 IL原理 强签名与加密 resx文件 由于时间有限,本文作为部门分享演示过程中辅助性文档,会对 ...

  2. html 微信video放大后无法返回问题

    android  video播放视频放大后无法返回,先debug下debugx5.qq.com 发现用的不是X5内核 直接激活  debugmm.qq.com/?forcex5=true  问题解决 ...

  3. Ajax常见面试题

    1,什么是ajax? 为什么要使用ajax? 1.ajax是"asynchornous javascript and xml "的缩写,指一种创建交互式网页应用的网页开发技术. 2 ...

  4. 吐血bug-- 多个input框接连blur事件导致alert接连弹出

    本来今天想记录一下Flow在vue源码中的应用,结果临时触发了个bug... bug描述: elementUi + Vue 技术 需求:一个表格中有至少两条数据,每条数据都有input框,在失去焦点后 ...

  5. JS 的继承

    1:原生链:prototype 儿子能够继承父亲的属性,也可以觉得遗传基因不好自己改属性,(但是不能改变老爸的属性). 看例子:             function farther(){     ...

  6. 1.4 GPU分析

    shader  加宏   编译说明glsl

  7. Python:当你遇到了the package “public”?

    前几天跑github上的一个python项目,先都是看看需要哪些模块哪些包,安装配置好环境的.可是看到 import public我眉头一皱,觉得事情并不简单! 所以准备扒一扒!当然项目需要也是真的哈 ...

  8. K邻近回归算法

    代码: # -*- coding: utf-8 -*- """ Created on Fri Jul 13 10:40:22 2018 @author: zhen &qu ...

  9. mssql sqlserver updatetext关键字应用简介说明

    摘要: 下文讲述updatetext的功能及举例说明 实验环境:sql server 2008 R2 updatetext关键字功能及语法说明 updatetext功能说明: updatetext的功 ...

  10. ORACLE复制表结构

    一般网上的方法: ; --复制表结构以及数据按where条件查询出的数据 ; --只复制表结构 但是上面的语法不会复制旧表的默认值.注释.键和索引,因此想要完美的复制表结构就需要先找到旧表的sql语句 ...