题目:https://vjudge.net/contest/323699#problem/A

题意:给你一棵树,然后有m个查询,每次查询问一条路径最大边小于给定查询的数量

思路:首先我们看到,我们其实可以计算出每个边权小于查询的所有连通块,然后sum+C(n,2),对每个连通块都加上值,然后就是答案了,但是这里注意查询数很多,我们肯定不能O(n)遍历每个查询,但是思路肯定是计算联通块里组合数的数量,怎么处理呢,我们注意到,他这个边权是的值的大小和我的连通块的有关,我们是否可以利用之前求出来的值呢,答案是可以的,我们可以对查询排序,先求值小的,然后到后面查询的时候用之前的连通块继续延伸,总的所有查询的复杂度我们也只是遍历了一遍树,但是我们dfs不好去处理,这里我们怎么弄呢,连通块的算法就那么几个,dfs,并查集,tarjan,我们可以排除dfs和tarjan,那么我们就肯定是用并查集了,我们对边权也进行排序,然后我们就可以利用每个边进行联通块的合并,然后贡献怎么计算呢,我们会发现A连通块和B连通块,然后A连通块的路径对已经算完了,B连通块的路径对算完了,然后现在要求的一个点在A连通块,一个点在Bl连通块,贡献就加上A.size*B.size

  1. #include<bits/stdc++.h>
  2. #define maxn 200005
  3. #define mod 1000000007
  4. using namespace std;
  5. typedef long long ll;
  6. struct sss{
  7. ll x,y,z;
  8. }a[maxn];
  9. struct eee{
  10. ll id,value;
  11. }cx[maxn];
  12. ll n,m,q;
  13. long long da[maxn];
  14. ll siz[maxn];
  15. ll f[maxn];
  16. int cmp(struct sss x,struct sss y){
  17. return x.z<y.z;
  18. }
  19. int cmp1(struct eee x,struct eee y){
  20. return x.value<y.value;
  21. }
  22. int find(int x){
  23. if(x==f[x]) return x;
  24. else return f[x]=find(f[x]);
  25. }
  26. int main(){
  27. scanf("%lld%lld",&n,&m);
  28. for(int i=;i<n-;i++){
  29. scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].z);
  30. }
  31. sort(a,a+n-,cmp);
  32. for(int i=;i<m;i++){
  33. cx[i].id=i;
  34. scanf("%lld",&cx[i].value);
  35. }
  36. sort(cx,cx+m,cmp1);
  37. for(int i=;i<=n;i++){
  38. f[i]=i;
  39. siz[i]=;
  40. }
  41. /*for(int i=0;i<n-1;i++){
  42. printf("%d %d %d\n",a[i].x,a[i].y,a[i].z);
  43. }*/
  44. ll dex=;
  45. ll sum=;
  46. for(int i=;i<n-;i++){
  47. if(a[i].z<=cx[dex].value){
  48. int xx=find(a[i].x);
  49. int yy=find(a[i].y);
  50. if(xx!=yy){
  51. sum+=siz[xx]*siz[yy];
  52. f[yy]=xx;
  53. siz[xx]+=siz[yy];
  54. }
  55. }
  56. else{
  57. da[cx[dex].id]=sum;
  58. dex++;
  59. if(dex==m) break;
  60. i--;
  61. }
  62. }
  63. for(;dex<m;dex++){
  64. da[cx[dex].id]=sum;
  65. }
  66. for(int i=;i<m;i++){
  67. printf("%lld ",da[i]);
  68. }
  69. }

CodeForces - Path Queries (并查集+离线查询)的更多相关文章

  1. Codeforces Round #582 (Div. 3) G. Path Queries (并查集计数)

    题意:给你带边权的树,有\(m\)次询问,每次询问有多少点对\((u,v)\)之间简单路径上的最大边权不超过\(q_i\). 题解:真的想不到用最小生成树来写啊.... 我们对边权排序,然后再对询问的 ...

  2. codeforces1213G Path Queries 并查集

    题意 给定n个结点的树,每条边有边权,有m个询问,每个询问给一个\(q_i\)输出树上有多少点对的简单路径上最大的边权不超过\(q_i\). 分析 用并查集维护点集,同时维护大小. 将所有边按边权排序 ...

  3. ACM学习历程—SNNUOJ 1110 传输网络((并查集 && 离线) || (线段树 && 时间戳))(2015陕西省大学生程序设计竞赛D题)

    Description Byteland国家的网络单向传输系统可以被看成是以首都 Bytetown为中心的有向树,一开始只有Bytetown建有基站,所有其他城市的信号都是从Bytetown传输过来的 ...

  4. ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线

    hdu 1811 Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  5. BZOJ5188: [Usaco2018 Jan]MooTube 并查集+离线处理

    BZOJ又不给题面... Luogu的翻译看不下去... 题意简述 有一个$n$个节点的树,边有权值,定义两个节点之间的距离为两点之间的路径上的最小边权 给你$Q$个询问,问你与点$v$的距离超过$k ...

  6. poj 2528 Mayor's posters 线段树 || 并查集 离线处理

    题目链接 题意 用不同颜色的线段覆盖数轴,问最终数轴上有多少种颜色? 注:只有最上面的线段能够被看到:即,如果有一条线段被其他的线段给完全覆盖住,则这个颜色是看不到的. 法一:线段树 按题意按顺序模拟 ...

  7. zoj3261 并查集离线处理

    Connections in Galaxy War Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & ...

  8. zoj 3261 逆向并查集+离线处理

    题意:给出一些点,每个点有权值,然后有一些边,相连.无向的.然后有一些操作 链接:点我 query a.表示从a出发的能到达的所有点权值最大的点的编号(相同取编号最小,而且权值要比自己大) desto ...

  9. Codeforces 455C Civilization(并查集+dfs)

    题目链接:Codeforces 455C Civilization 题目大意:给定N.M和Q,N表示有N个城市,M条已经修好的路,修好的路是不能改变的.然后是Q次操作.操作分为两种.一种是查询城市x所 ...

随机推荐

  1. UI自动化之8种基础定位

    UI自动化的核心在于定位 目录 1.8种基础定位方法 2.xpath定位 3.css定位 4.多组元素 1.8种基础定位方法 driver.find_element_by_id() #id定位 dri ...

  2. 模拟鼠标向下滚动 http://bbs.2ccc.com/topic.asp?topicid=461769

    我想模拟鼠标滚轮,下面的代码能向上滚动,怎么样下向滚动啊 mouse_event( MOUSEEVENTF_WHEEL,0,0,WHEEL_DELTA,0); 我把参数设置为mouse_event(  ...

  3. EL表达式.jsp指令等

    1.JSP标准指令:<%@ 标准指令(属性 )%><%@ page %><%@ include %><%@ taglib %> 2.JSP程序代码元素: ...

  4. gitee.ZC_blog快速方案

    1. 1.1.改 hexo的配置文件中 gitee的路径 复制URL,到hexo的配置文件_config.yml …… deploy: type: git # type为git repo: https ...

  5. python函数纯概念汇总(一)

    在使用python的时候由于前期基本概念没有分清楚,所以需要重新归纳汇总学一学. 一.什么是函数: 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很 ...

  6. [Web 前端] 002 html 常用行行级元素

    目录 1. html 常用的行级元素 1.1 链接标签 1.2 a 标签的锚点的使用 1.3 文本标签 1.4 无语义的行级元素 span 1.5 html 中的实体字符 1. html 常用的行级元 ...

  7. [Web 前端] 001 html 常用块级标签

    目录 1. html "总体框架" 2. 常用的 HTML 块级标签(块元素) 2.1 知识点 2.2 以下 code 均写在 body 体中 2.2.1 标题标签,只有 h1-h ...

  8. [19/05/06-星期一] JDBC(Java DataBase Connectivity,java数据库连接)_基本知识

    一.概念 JDBC(Java Database Connectivity)为java开发者使用数据库提供了统一的编程接口,它由一组java类和接口组成.是java程序与数据库系统通信的标准API. J ...

  9. hdu-1045.fire net(缩点 + 二分匹配)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  10. go中基本数据类型的相互转换

    代码 // 基本数据类型的相互转换 package main import ( // 如果一个包没有被使用过,但又不想去掉,可在包名前加"_ "表示忽略 // 比如:_ " ...