原文链接:https://blog.csdn.net/Patrickpwq/article/details/86656456

给定一棵n个点的树(n=1e5),有边权,
两点间距离定义为两点路径上的
边权最小值。m个询问(m=1e5),k,v,
询问对于点v,距离>=k的点有多少个(不含v)
Input
n个点,m个询问
下面n-1行为边的信息
下面m行
ki和vi

Output

Sample Input
7 4
1 2 2
1 3 1
3 4 6
3 5 5
2 6 4
2 7 3
2 1
4 3
6 5
10 7
Sample Output
3
2
0
0

标算是离线并查集 这里提供一种Kruskal重构树的简单做法

将重构树建出来后 此时是一个小根堆

我们倍增的往上跳 直到找到一个祖先的权值刚好小于K

显然 这个祖先的子树内的所有点到v的距离都是大于等于K的 因为此时u到v的距离是LCA(u,v),而显然,LCA(u,v)一定属于这个祖先的子树

#include<bits/stdc++.h>
const int N=100005;
using namespace std;
template<class T>
inline void read(T &x)
{
x=0;
static char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
}
int n,Q,cnt,first[2*N],tot,size[2*N];
struct Edge
{
int from,to,next,val;
bool operator <(const Edge &p) const
{
return this->val>p.val;
}
}e[N],edge[8*N];
inline void addedge(int x,int y)
{
tot++;
edge[tot].to=y; edge[tot].next=first[x]; first[x]=tot;
}
int father[2*N],up[2*N][22],val[2*N],depth[2*N];
inline int getfather(int x)
{
if(father[x]==x) return x;
return father[x]=getfather(father[x]);
}
void Kruskal_Rebuild()
{
sort(e+1,e+cnt+1);
for(register int i=1;i<=2*n;i++) father[i]=i;
int sign=n;
for(register int i=1;i<=cnt;i++)
{
int fx=getfather(e[i].from); int fy=getfather(e[i].to);
if(fx==fy) continue;
father[fx]=father[fy]=++sign;
addedge(fx,sign); addedge(sign,fx);
addedge(fy,sign); addedge(sign,fy);
val[sign]=e[i].val;
}
}
void dfs(int now,int fa)
{
if(now<=n) size[now]=1;
depth[now]=depth[fa]+1;
up[now][0]=fa;
for(int i=1;i<=19;i++) up[now][i]=up[up[now][i-1]][i-1];
for(int u=first[now];u;u=edge[u].next)
{
int vis=edge[u].to;
if(vis==fa) continue;
dfs(vis,now);
size[now]+=size[vis];
}
}
int main()
{
cin>>n>>Q;
for(register int i=1;i<=n-1;i++)
{
int x,y,z;
read(x); read(y); read(z);
e[++cnt].from=x; e[cnt].to=y; e[cnt].val=z;
}
Kruskal_Rebuild();
dfs(2*n-1,0);
while(Q--)
{
int v,k;
read(k); read(v);
for(int i=19;i>=0;i--)
if(val[up[v][i]]>=k) v=up[v][i];
cout<<size[v]-1<<'\n';
}
return 0;
}

  

【USACO18JAN】MooTube的更多相关文章

  1. 【LG4185】[USACO18JAN]MooTube

    [LG4185][USACO18JAN]MooTube 题面 洛谷 题解 先将所有操作和询问离线 然后按照边权从大到小将操作和询问排序 利用\(two\;pointers\),每次扫到一个询问,将边权 ...

  2. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  3. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  4. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  6. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  7. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  8. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  9. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

随机推荐

  1. NLP 中任务及相关概念

    命名实体识别 命名实体识别(Named Entity Recognition,简称NER),又称作"专名识别",是指识别文本中具有特定意义的实体,主要包括人名.地名.机构名.专有名 ...

  2. python--线程锁,队列

    #线程数据安全处理--同步锁 import time def sub(): global num print("ok") lock.acquire()#获取这把锁--->只有 ...

  3. 北京师范大学第十五届ACM决赛-重现赛J Just A String (kmp算法延伸)

    链接:https://ac.nowcoder.com/acm/contest/3/J 来源:牛客网 Just A String 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  4. 每日一蠢 .kettle 下的kettle.properties文件内配置的内容不能被识别

    昨天装封装好的ETL 工具  窝将环境变量中的KETTLE_HOME删除了, 结果 .kettle 下的kettle.properties文件内配置的内容不能被识别 can't parse argum ...

  5. YNOI2016:掉进兔子洞 (莫队+bitset)

    YNOI2016:掉进兔子洞 题意简述: 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于这 ...

  6. SpringBoot使用Easypoi导出excel示例

    SpringBoot使用Easypoi导出excel示例 https://blog.csdn.net/justry_deng/article/details/84842111

  7. 【python基础】集合方法汇总

    一.定义 用于存储一组无序的不重复的数据 二.特点 1. 集合是无序的 2.集合中的元素是不重复的, 唯一的 3.集合中存储的数据必须是不可变的数据类型 4.集合是可变的数据类型 三.语法 set1 ...

  8. 【微信小程序】setData的使用以及注意事项

    Page.prototype.setData(Object data, Function callback) setData 函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.da ...

  9. 6353. 【NOIP2019模拟】给(ca)

    题目描述 题解 虫合 由于前几天被教♂育了,所以大力找了一发规律 先把m-1,设f[i][j]表示m≤i,有j个叶子节点的答案 转移显然,也显然是O(n^3)的 把f打出来后长这样: 1 1 1 1 ...

  10. java——逻辑运算符与(&和&&)或(|和||)

    区别: 1意思不同: &&是“与”的意思,||是“或者”的意思. 2 使用上不同:a && b:a和b同时为true 才返回 true, 否则返回false:a || ...