博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ5188】 [Usaco2018 Jan]MooTube
阅读量:5797 次
发布时间:2019-06-18

本文共 2316 字,大约阅读时间需要 7 分钟。

BZOJ5188 [Usaco2018 Jan]MooTube


突然发现BZOJ没有题目,放题面.

题意翻译

题面描述

在业余时间,Farmer John创建了一个新的视频共享服务,他将其命名为MooTube。在MooTube上,Farmer John的奶牛可以录制,分享和发现许多有趣的视频。他的奶牛已经发布了 N个视频 ( $1 \leq N \leq 100,000 \(),为了方便将其编号为\) 1 \ldots N $。然而,FJ无法弄清楚如何帮助他的奶牛找到他们可能喜欢的新视频。

FJ希望为每个MooTube视频创建一个“推荐视频”列表。这样,奶牛将被推荐与他们已经观看过的视频最相关的视频。

FJ设计了一个“相关性”度量标准,顾名思义,它确定了两个视频相互之间的相关性。他选择$ N-1$ 对视频并手动计算其之间的相关性。然后,FJ将他的视频建成一棵树,其中每个视频是节点,并且他手动将$ N-1 $对视频连接。为了方便,FJ选择了 \(N-1​\)对,这样任意视频都可以通过一条连通路径到达任意其他视频。 FJ决定将任意一对视频的相关性定义为沿此路径的任何连接的最小相关性。

Farmer John想要选择一个 \(K\) 值,以便在任何给定的MooTube视频旁边,推荐所有其他与该视频至少有 \(K\) 相关的视频。然而,FJ担心会向他的奶牛推荐太多的视频,这可能会分散他们对产奶的注意力!因此,他想设定适当的 \(K\) 值。 Farmer John希望得到您的帮助,回答有关 \(K\)值的推荐视频的一些问题。

输入

第一行输入包含 \(N\)\(Q\) ( \(1 \leq Q \leq 100,000\) )。 接下来的 \(N-1\) 行描述了FJ手动比较的一对视频。 每行包括三个整数 \(p_i\)\(q_i\)\(r_i\) ( \(1 \leq p_i, q_i \leq N\), \(1 \leq r_i \leq 1,000,000,000\)),表示视频 \(p_i\)\(q_i\)已连接并且相关性为\(r_i\)。 接下来的 \(Q\) 行描述了Farmer John的第 \(Q\) 个问题。 每行包含两个整数, \(k_i\)\(v_i\) ($ 1 \leq k_i \leq 1,000,000,000$,\(1 \leq v_i \leq N\)),表示FJ的第 \(i\) 个问题询问中当 \(K = k_i\) 时,第 \(v_i\) 个视频推荐列表中将推荐的视频数。

输出

输出 \(Q\) 行。 在第 \(i\) 行,输出FJ的第 \(i\) 个问题的答案。

Solution

看到题目没有思绪?

发现如果大的可以行,小的一定可以?(这个很显然)

那么接着考虑如果把询问和边全部排序,就可以并查集记录一下\(siz\)然后很方便的求解不是吗?

代码实现

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define ll long long#define re register#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)inline int gi(){ int f=1,sum=0;char ch=getchar(); while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();} return f*sum;}int n,Q;struct node{ int u,v,w; bool operator<(const node b)const{ return w>b.w; }}e[100010];int f[100010],siz[100010],ans[100010];int find(int x){ if(x!=f[x])f[x]=find(f[x]); return f[x];}struct Query{ int k,v,id; bool operator<(const Query b)const{ return k>b.k; }}ques[100010];int main(){ n=gi();Q=gi(); for(int i=1;i
=ques[i].k){ int u=e[id].u,v=e[id].v;id++; if(find(u)==find(v))continue; u=find(u);v=find(v); f[v]=u;siz[u]+=siz[v]; } ans[ques[i].id]=siz[find(ques[i].v)]-1; } for(int i=1;i<=Q;i++)printf("%d\n",ans[i]); return 0;}

转载于:https://www.cnblogs.com/mle-world/p/10312927.html

你可能感兴趣的文章
LINUX简单指令(时间戳转换)
查看>>
Squid 反向代理服务器配置
查看>>
情深意伤
查看>>
Java I/O操作
查看>>
Tomcat性能调优
查看>>
项目管理心得
查看>>
Android自学--一篇文章基本掌握所有的常用View组件
查看>>
C语言--static的用法
查看>>
Java基础之Java并发编程:volatile关键字解析
查看>>
Web版RSS阅读器(二)——使用dTree树形加载rss订阅分组列表
查看>>
虚拟化环境下对公司业务服务器实现NLB+SQL高可用(一)
查看>>
Synology NAS 存储系统多路径连接Vmware ESXi 6.5
查看>>
群晖NAS的iSCSI设置
查看>>
Linux DHCP 中继代理
查看>>
lduan HyPer-V 简单管理(六)
查看>>
linux系统密码忘记的5个解决方法
查看>>
排序(冒泡排序,插入排序,希尔排序,选择排序,堆排序)
查看>>
PHP_010 时间日期
查看>>
基础算法题
查看>>
Nginx学习之六-nginx核心进程模型
查看>>