题目戳我

\(\text{Solution:}\)

考虑点分治。对于这个两点之间,它意味着这点对必须是不一样的。

考虑用双指针统计答案。显然,对于两个数\(a,b\),要让\(a+b=k,a\)越大则\(b\)越小。于是可以用双指针统计答案。

剩下的就是一个点分治板子。

GrNB!!!

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+10;
const int inf=(1<<30);
int tot,head[MAXN],siz[MAXN],S,k,n,sum[MAXN];
struct edge{
int nxt,to,dis;
}e[MAXN];
int ms,mson[MAXN],rt,ans;
bitset<MAXN>vis;
inline void add(int x,int y,int w){
e[++tot].to=y;
e[tot].nxt=head[x];
e[tot].dis=w;
head[x]=tot;
}
void Gr(int x,int fa){
siz[x]=1;mson[x]=0;
for(int i=head[x];i;i=e[i].nxt){
int j=e[i].to;
if(vis[j]||j==fa)continue;
Gr(j,x);siz[x]+=siz[j];
if(siz[j]>mson[x])mson[x]=siz[j];
}
if(S-siz[x]>mson[x])mson[x]=S-siz[x];
if(ms>mson[x])rt=x,ms=mson[x];
}
int t,tt,dis[MAXN],tr[MAXN];
void Getdis(int x,int fa,int d){
dis[++t]=d;
for(int i=head[x];i;i=e[i].nxt){
int j=e[i].to;
if(vis[j]||j==fa)continue;
Getdis(j,x,d+e[i].dis);
}
}
void solve(int x,int d,int fg){
t=0;Getdis(x,0,d);
tt=0;sort(dis+1,dis+t+1);
int l=1,r=t;
while(l<=r){
if(dis[l]+dis[r]<=k){ans+=(r-l)*fg,++l;}
else --r;
}
}
void work(int x,int s){
vis[x]=1;solve(x,0,1);
for(int i=head[x];i;i=e[i].nxt){
int j=e[i].to;
if(vis[j])continue;
solve(j,e[i].dis,-1);
ms=inf;rt=0;
S=siz[j]<siz[x]?siz[j]:(s-siz[x]);
Gr(j,0);work(rt,S);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;++i){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
scanf("%d",&k);
rt=0;ms=inf;S=n;Gr(1,0);work(rt,S);
printf("%d\n",ans);
return 0;
}

第一次写的时候犯了一个浅显的错误:相加为\(k\)的路径并不是只找到最小的路径相匹配的最大路径即可,它并不存在一个总包含的关系。(错误要点)

【题解】Tree的更多相关文章

  1. 2018HN省队集训

    HNOI2018省队集训 Day 1 流水账 T1 tree 换根+求\(lca\)+求子树和,一脸bzoj3083遥远的国度的既视感.子树和讨论一下就好了,\(lca\)?也是大力讨论一波. 先写了 ...

  2. C#版 - 226. Invert Binary Tree(剑指offer 面试题19) - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - 2 ...

  3. [LeetCode 题解]: Binary Tree Preorder Traversal

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a bi ...

  4. [LeetCode 题解]: Symmetric Tree

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述   Given a ...

  5. [LeetCode 题解]: Maximum Depth of Binary Tree

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  6. 竞赛题解 - Broken Tree(CF-758E)

    Broken Tree(CF-758E) - 竞赛题解 贪心复习~(好像暴露了什么算法--) 标签:贪心 / DFS / Codeforces 『题意』 给出一棵以1为根的树,每条边有两个值:p-强度 ...

  7. Codeforces Round #530 (Div. 2):D. Sum in the tree (题解)

    D. Sum in the tree 题目链接:https://codeforces.com/contest/1099/problem/D 题意: 给出一棵树,以及每个点的si,这里的si代表从i号结 ...

  8. 【题解】Digit Tree

    [题解]Digit Tree CodeForces - 716E 呵呵以为是数据结构题然后是淀粉质还行... 题目就是给你一颗有边权的树,问你有多少路径,把路径上的数字顺次写出来,是\(m\)的倍数. ...

  9. 【题解】CF611H New Year and Forgotten Tree

    [题解]CF611H New Year and Forgotten Tree 神题了... 题目描述 给定你一棵树,可是每个节点上的编号看不清了,只能辨别它的长度.现在用问号的个数代表每个节点编号那个 ...

  10. 【题解】[P4178 Tree]

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

随机推荐

  1. Spine学习五- spine动画融合

    在许多地方,都需要用到动画融合,unity的新版动画系统已经能够很方便的进行动画融合,那么使用spine的动画状态机的情况下,如何来进行动画融合呢? 官方有两种方案,一种是使用混合动作实现,另一种是使 ...

  2. 熟练剖分(tree) 树形DP

    熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...

  3. C++11中std::move、std::forward、左右值引用、移动构造函数的测试

    关于C++11新特性之std::move.std::forward.左右值引用网上资料已经很多了,我主要针对测试性能做一个测试,梳理一下这些逻辑,首先,左值比较熟悉,右值就是临时变量,意味着使用一次就 ...

  4. H5选择器

    1.标签选择器 注意点:1. 标签选择器选中当前所有的标签,而不能单独选择某个标签 2.标签选择器不无多深都能被选中     3.只要是HTML中的标签就可以作为表亲啊选择器(h/a/img/ul/o ...

  5. BIO应用-RPC框架

    为什么要有RPC?  我们最开始开发的时候,一个应用一台机器,将所有功能都写在一起,比如说比较常见的电商场景. 随着我们业务的发展,我们需要提示性能了,我们会怎么做?将不同的业务功能放到线程里来实现异 ...

  6. linux vi编辑

    编辑模式 使用vi进入文本后,按i开始编辑文本 退出编辑模式 按ESC键,然后: 退出vi :q! 不保存文件,强制退出vi命令 :w 保存文件,不退出vi命令 :wq 保存文件,退出vi命令 中断v ...

  7. 高德地图POI爬取_Python

    高德地图POI 官方文档:https://lbs.amap.com/api/webservice/guide/api/search#introduce 官网控制台:https://lbs.amap.c ...

  8. HTTP走私

    干货 https://paper.seebug.org/1048/

  9. about blog

    前言 今天无意中发现了一个小姐姐自己设计的的博客,感觉非常的nice,就随手copy一下,完了感觉效果还蛮好的 end 附上小姐姐的博客以及教程

  10. 使用 Promise 实现任务队列发送请求,实现最大请求数目限制

    核心 设置最大请求数量,当前请求数量,待执行队列 调用时,创建一个新任务,然后判断是否达到最大请求数量,若达到则将任务追加到待执行队列,否则,则直接执行该任务.并返回Promise 创建任务时,需要返 ...