P7283 [COCI2020-2021#4] Janjetina
显然点分治。
考虑设 \(Mx_i\) 为重心到 \(i\) 的链的最大值,\(L_i\) 为路径长度,那么条件变为:
\]
我们考虑直接枚举当前的 \(\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的更多相关文章
- codevs 2021 中庸之道
2021 中庸之道 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给定一个长度为N的序列,有Q次询问,每次 ...
- Bzoj 1982: [Spoj 2021]Moving Pebbles 博弈论
1982: [Spoj 2021]Moving Pebbles Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 130 Solved: 88[Submi ...
- poj 2021 Relative Relatives(暴力)
题目链接:http://poj.org/problem?id=2021 思路分析:由于数据较小,采用O(N^2)的暴力算法,算出所有后代的年龄,再排序输出. 代码分析: #include <io ...
- iPhone屏蔽IOS更新、iPhone系统更新的提示(免越狱,有效期更新至2021年)
iPhone屏蔽IOS更新.iPhone系统更新的提示(免越狱,有效期更新至2021年) 1.在Safari浏览器中粘贴如下链接,按提示打开链接. 输入http://apt.dataage.pub 2 ...
- HDU 2021 发工资咯:)
http://acm.hdu.edu.cn/showproblem.php?pid=2021 Problem Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的 ...
- Math.abs(~2020) 按位取反后的绝对值是多少 2021, 按位取反后,比正数多1
Math.abs(~2020) 按位取反后的绝对值是多少 2021, 按位取反后,比正数多1 int 值的取值 范围: -128 --- 127 之间, 0000 0000 按位取 ...
- 部分PR回写的数量带有小数,分别是2023工厂的纸箱104007000389,2021工厂的纸盒404002005930;
描述:部分PR回写的数量带有小数,分别是2023工厂的纸箱104007000389,2021工厂的纸盒404002005930: 原因:所有物料规划PR时对舍入值的先后考虑逻辑影响到回写出来的temp ...
- codves 2021中庸之道
2021 中庸之道 http://codevs.cn/problem/2021/ 题目描述 Description 给定一个长度为N的序列,有Q次询问,每次询问区间[L,R]的中位数. 数据保证序列中 ...
- HDU 2021 发工资咯:)(最水贪心)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2021 发工资咯:) Time Limit: 2000/1000 MS (Java/Others) ...
- 【BZOJ】2021: [Usaco2010 Jan]Cheese Towers(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=2021 噗,自己太弱想不到. 原来是2次背包. 由于只要有一个大于k的高度的,而且这个必须放在最顶,那 ...
随机推荐
- 在 VS Code 中,一键安装 MCP Server!
大家好!我是韩老师. 本文是 MCP 系列文章的第三篇.之前的两篇文章是: Code Runner MCP Server,来了! 从零开始开发一个 MCP Server! 经过之前两篇文章的介绍,相信 ...
- 最爱lx-music的音源哪里去了?
最爱lx-music,让你满心喜欢,可是音源没有了,因为被投诉给全部关了. 公心作者增加了自定义源. 六音提供了音源,做了一件大善事.注意的是音源会一直初始化.那就下载适合的版本: 欣赏阿鲁阿卓如痴如 ...
- luat编程MQTT的自动重连失败分析
正确用法 查看代码 --- 模块功能:MQTT客户端处理框架 -- @author openLuat -- @module mqtt.mqttTask -- @license MIT -- @copy ...
- JAVA stream集合List<Map>转二维集合Map<String,Map<String,Object>>
简介 将一个 List<Map> 转换为一个二维的 Map 结构通常意味着我们需要创建一个 Map<K, Map<K, V>>.这里,外部的 Map 使用某个键(比 ...
- jmeter之多并发
1.做压力测试时需要设置线程数,2.造数据时跑多接口多条数据需要设置线程数,并且保证每个线程的多接口顺序执行.3.需要设置数据不重复或者自增 一.设置线程数 主要用于压力测试需要多并发时设置线程数,以 ...
- DP学习总结
动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. -----OI Wiki 例.1-最大子段和 分析 DP四步 ⑴定义状态 定义\(dp_i\)表示以\(i\)结尾的最大子段 ...
- ThinkPHP 中闭包在数组查询条件中的深度应用
一.闭包与数组条件的协同原理 在 ThinkPHP 的查询体系中,数组条件是构建查询逻辑的核心载体.当数组条件的值为闭包(Closure)时,框架会自动将其解析为动态子查询生成器,实现运行时按需构建 ...
- 如何构造一款类似One API的大模型集成平台
作为AI领域的开发者,我们经常需要调用多个不同的大语言模型,但面对各家不同的API规范和接入方式,集成工作变得繁琐.构建一个统一的大模型集成平台,能够极大地简化这一过程. 本文将探讨如何实现一个兼容O ...
- 【经验】C++|在MFC子线程中,通过正确的传参,访问主线程对话框程序的控件对象、调用类函数
引言 MFC中子线程操控窗口的控件的难点在于: 子线程函数不属于窗口类. 比方说, 窗口类CMFCApplication3Dlg的点击事件函数如下: void CMFCApplication3Dlg: ...
- 【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过
文章目录 实验三 FreeRTOS-MPU 保护绕过 实验要求 子任务1 逆向分析StartFreeRTOS 打印 Flag 函数名称和地址 用于提权的函数名称和地址 填写的代码 模拟运行截图 **附 ...