link

显然点分治。

考虑设 \(Mx_i\) 为重心到 \(i\) 的链的最大值,\(L_i\) 为路径长度,那么条件变为:

\[\max(Mx_x, Mx_y)-L_x - k \ge L_y
\]

我们考虑直接枚举当前的 \(\max(Mx_x, Mx_y)=Mx_x\),那么需要保证之前加入的点的 \(Mx_y\) 要小于等于 \(Mx_x\),直接以 \(Mx\) 为关键字 sort 一遍,然后直接树状数组爆算。

但是这样显然会把同一个子树内的假点对给统计到,多做一遍减去即可。

复杂度 \(O(n\log^2 n)\)

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <cctype>
#include <vector>
using namespace std;
typedef long long ll;
typedef pair <int, int> Pii;
const int INF=0x3f3f3f3f;
const int mo=1e9+7;
inline int read(){
char ch=getchar();int x=0, f=1;
while(!isdigit(ch)){if(ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
inline void write(int x){
if(x<0) putchar('-'), x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline int ksm(int a, int b){
int ret=1;
for(; b; b>>=1, a=1ll*a*a%mo)
if(b&1) ret=1ll*ret*a%mo;
return ret;
}
const int N=1e5+5;
const int M=1e5;
int idc, vis[N], siz[N], Mx[N], dep[N], mn, G, tot, h[N];
struct Edge{int to, nxt, w;}d[N*2];
void add(int x, int y, int w){d[++tot]=(Edge){y, h[x], w};h[x]=tot;}
#define lowbit(x) (x&(-x))
int n, bit[N*2], K;
void add(int x, int v){
++x;
for(; x<=M; x+=lowbit(x)) bit[x]+=v;
}
int query(int x){
if((++x)<=0) return 0;
int res=0;
for(; x; x-=lowbit(x)) res+=bit[x];
return res;
}
#undef lowbit
int sta[N], top;
bool cmp(int x, int y){
return Mx[x]<Mx[y];
}
void Getg(int x, int up){
vis[x]=idc, siz[x]=1;int mx=0;
for(int i=h[x], v; i; i=d[i].nxt)
if(vis[v=d[i].to]<idc&&vis[v]!=-1)
Getg(v, up), siz[x]+=siz[v], mx=max(mx, siz[v]);
mx=max(mx, up-siz[x]);
if(mx<mn) mn=mx, G=x;
}
long long ans=0;
void solve(int L, int R, int flg){
int ls=ans;
sort(sta+L, sta+R+1, cmp);
for(int i=L; i<=R; ++i)
ans+=flg*query(Mx[sta[i]]-dep[sta[i]]-K),
add(dep[sta[i]], 1);
for(int i=L; i<=R; ++i) add(dep[sta[i]], -1);
}
void calc(int x, int rt){
vis[x]=idc;sta[++top]=x, siz[x]=1;
for(int i=h[x], v; i; i=d[i].nxt)
if(vis[v=d[i].to]<idc&&vis[v]!=-1){
int lst=top;
Mx[v]=max(Mx[x], d[i].w), dep[v]=dep[x]+1,
calc(v, 0), siz[x]+=siz[v];
if(x!=rt) continue;
solve(lst+1, top, -1); }
if(x==rt) solve(1, top, 1);
}
void dfz(int rt){
// printf("---%d\n", rt);
++idc, dep[rt]=0, Mx[rt]=0, top=0;
calc(rt, rt), vis[rt]=-1;
for(int i=h[rt], v; i; i=d[i].nxt)
if(vis[v=d[i].to]!=-1)
++idc, G=v, mn=siz[v],
Getg(v, siz[v]), dfz(G);
}
signed main(){
n=read(), K=read();
for(int i=1, x, y, z; i<n; ++i)
x=read(), y=read(), z=read(),
add(x, y, z), add(y, x, z);
++idc, G=1, mn=n, Getg(1, n), dfz(G);
ans=2ll*ans;
printf("%lld", ans);
return 0;
}

P7283 [COCI2020-2021#4] Janjetina的更多相关文章

  1. codevs 2021 中庸之道

    2021 中庸之道  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 给定一个长度为N的序列,有Q次询问,每次 ...

  2. Bzoj 1982: [Spoj 2021]Moving Pebbles 博弈论

    1982: [Spoj 2021]Moving Pebbles Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 130  Solved: 88[Submi ...

  3. poj 2021 Relative Relatives(暴力)

    题目链接:http://poj.org/problem?id=2021 思路分析:由于数据较小,采用O(N^2)的暴力算法,算出所有后代的年龄,再排序输出. 代码分析: #include <io ...

  4. iPhone屏蔽IOS更新、iPhone系统更新的提示(免越狱,有效期更新至2021年)

    iPhone屏蔽IOS更新.iPhone系统更新的提示(免越狱,有效期更新至2021年) 1.在Safari浏览器中粘贴如下链接,按提示打开链接. 输入http://apt.dataage.pub 2 ...

  5. HDU 2021 发工资咯:)

    http://acm.hdu.edu.cn/showproblem.php?pid=2021 Problem Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的 ...

  6. Math.abs(~2020) 按位取反后的绝对值是多少 2021, 按位取反后,比正数多1

    Math.abs(~2020)  按位取反后的绝对值是多少 2021, 按位取反后,比正数多1 int 值的取值 范围:   -128 ---  127   之间, 0000 0000     按位取 ...

  7. 部分PR回写的数量带有小数,分别是2023工厂的纸箱104007000389,2021工厂的纸盒404002005930;

    描述:部分PR回写的数量带有小数,分别是2023工厂的纸箱104007000389,2021工厂的纸盒404002005930: 原因:所有物料规划PR时对舍入值的先后考虑逻辑影响到回写出来的temp ...

  8. codves 2021中庸之道

    2021 中庸之道 http://codevs.cn/problem/2021/ 题目描述 Description 给定一个长度为N的序列,有Q次询问,每次询问区间[L,R]的中位数. 数据保证序列中 ...

  9. HDU 2021 发工资咯:)(最水贪心)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2021 发工资咯:) Time Limit: 2000/1000 MS (Java/Others)    ...

  10. 【BZOJ】2021: [Usaco2010 Jan]Cheese Towers(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2021 噗,自己太弱想不到. 原来是2次背包. 由于只要有一个大于k的高度的,而且这个必须放在最顶,那 ...

随机推荐

  1. 移动应用APP购物车(店铺系列二)

    今天还是说移动app开发,店铺系列文章,我们经常去超市使用购物车,即一个临时的储物空间,用完清空回收.我大兄弟说, 平时很忙,录入订单的目录很多,临时有事回来要可以继续填写,提交订单后才算结束,这就是 ...

  2. 即时通信SSE和WebSocket对比

    Server-Sent Events (SSE) 和 WebSocket 都是用于实现服务器与客户端实时通信的技术,但它们在设计目标.协议特性和适用场景上有显著区别.以下是两者的详细对比: 一.核心区 ...

  3. 移动开发webapp开发常用meta设置手机浏览器全屏模式,webappmeta

    1.WebApp全屏模式: <meta name="viewport" content="width=device-width,initial-scale=1.0, ...

  4. 在Python后端项目FastApi中使用MongoDB进行数据处理

    我在前面随笔<在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持>中介绍了对于EAV数据存储的时候,我们把变化字段的数据记录存储在MongoDB数 ...

  5. C# 线程基础——用户模式、内核模式

    C# 线程基础--用户模式.内核模式 参照:用户模式和内核模式 - Windows drivers | Microsoft Docs 基础概念 运行 Windows 的计算机中的处理器有两个不同模式: ...

  6. Tortoise-ORM级联查询与预加载性能优化

    title: Tortoise-ORM级联查询与预加载性能优化 date: 2025/04/26 12:25:42 updated: 2025/04/26 12:25:42 author: cmdra ...

  7. 【BUG】Message = “无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。“, StackTrace = “ 在 System.Reflection.

    环境: Visual Studio 2019 C#项目遇到这种情况时,是因为有多个依赖出了问题(也可能是只有一个但被误报成多个),此时点开"查看详细信息",可以快速监视Except ...

  8. Axure RP医疗在线挂号问诊原型图医院APP原形模板

    Axure RP医疗在线挂号问诊原型图医院APP原形模板 医疗在线挂号问诊Axure RP原型图医院APP原形模板,是一款原创的医疗类APP,设计尺寸采用iPhone13(375*812px),原型图 ...

  9. 鸿蒙Next开发实战教程--银行App

    昨天Mate70的官方预热直接引起网络爆炸,现在预约人数已经两百多万了,大家都这么有米吗 今天跟大家分享一个银行app实战教程. 页面虽然看起来比较复杂,但是仔细分析一下并不难,下面跟大家分享一下本项 ...

  10. 利用java8 stream流将一个对象集合转换成另一个对象集合

    //需要字段名一致 List<UserCheckData> userCheckDataList = null; List<UserCheckPO> list = userChe ...