【USACO18JAN】MooTube
原文链接: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的更多相关文章
- 【LG4185】[USACO18JAN]MooTube
[LG4185][USACO18JAN]MooTube 题面 洛谷 题解 先将所有操作和询问离线 然后按照边权从大到小将操作和询问排序 利用\(two\;pointers\),每次扫到一个询问,将边权 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
随机推荐
- NLP 中任务及相关概念
命名实体识别 命名实体识别(Named Entity Recognition,简称NER),又称作"专名识别",是指识别文本中具有特定意义的实体,主要包括人名.地名.机构名.专有名 ...
- python--线程锁,队列
#线程数据安全处理--同步锁 import time def sub(): global num print("ok") lock.acquire()#获取这把锁--->只有 ...
- 北京师范大学第十五届ACM决赛-重现赛J Just A String (kmp算法延伸)
链接:https://ac.nowcoder.com/acm/contest/3/J 来源:牛客网 Just A String 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...
- 每日一蠢 .kettle 下的kettle.properties文件内配置的内容不能被识别
昨天装封装好的ETL 工具 窝将环境变量中的KETTLE_HOME删除了, 结果 .kettle 下的kettle.properties文件内配置的内容不能被识别 can't parse argum ...
- YNOI2016:掉进兔子洞 (莫队+bitset)
YNOI2016:掉进兔子洞 题意简述: 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于这 ...
- SpringBoot使用Easypoi导出excel示例
SpringBoot使用Easypoi导出excel示例 https://blog.csdn.net/justry_deng/article/details/84842111
- 【python基础】集合方法汇总
一.定义 用于存储一组无序的不重复的数据 二.特点 1. 集合是无序的 2.集合中的元素是不重复的, 唯一的 3.集合中存储的数据必须是不可变的数据类型 4.集合是可变的数据类型 三.语法 set1 ...
- 【微信小程序】setData的使用以及注意事项
Page.prototype.setData(Object data, Function callback) setData 函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.da ...
- 6353. 【NOIP2019模拟】给(ca)
题目描述 题解 虫合 由于前几天被教♂育了,所以大力找了一发规律 先把m-1,设f[i][j]表示m≤i,有j个叶子节点的答案 转移显然,也显然是O(n^3)的 把f打出来后长这样: 1 1 1 1 ...
- java——逻辑运算符与(&和&&)或(|和||)
区别: 1意思不同: &&是“与”的意思,||是“或者”的意思. 2 使用上不同:a && b:a和b同时为true 才返回 true, 否则返回false:a || ...