https://codeforces.com/gym/103145/problem/K

一开始看到有环,就想着缩点了,但是对于每次询问,如果都建一个新图,必定会TLE

所以采用离线处理的方法,把询问按照由大到小来排序,这样就可以边询问边建图。

可以采用并查集的方法,开个记录每个集合中元素的个数。当两个集合合并时,产生的新数对个数就是两个集合大小之积。

合并的次序很重要,一定要先处理完再去合并:

//这个顺序重要,一定要是先处理完再合并,不要以为fa没影响。
        //因为先合并的话,如果某个元素的祖先刚好是自己,那么这个元素就是先跑到了别人家再合并的,大小也是用的别人的大小

最后还要注意加速cin,因为输入的数据量比较大,直接cin会超时QWQ,或者scanf也可以

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
const int maxn=3e5;
int cnt,fa[maxn];
ll ans[maxn],setnum[maxn];struct node{int fr,to,w;
}e[maxn];struct query{int id,d;
}p[maxn];void add(int u,int v,int w){e[++cnt].fr=u;e[cnt].to=v;e[cnt].w=w;
}bool cmp_e(node a,node b){return a.w>b.w;
}bool cmp_q(query a,query b){return a.d>b.d;
}int getfa(int x){return fa[x]==x?x:fa[x]=getfa(fa[x]);
}signed main(){ios::sync_with_stdio(false); //是个指令,所以不能放在头文件里 cin.tie(0);cout.tie(0);int t;cin>>t;while(t--){int n,m,q;cin>>n>>m>>q;cnt=0;for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;add(u,v,w);}for(int i=1;i<=q;i++){cin>>p[i].d;p[i].id=i;}sort(e+1,e+1+cnt,cmp_e);sort(p+1,p+1+q,cmp_q);int k=1;ll sum=0;for(int i=1;i<=n;i++) setnum[i]=1;for(int i=1;i<=q;i++){while(e[k].w>=p[i].d&&k<=cnt){int u=e[k].fr,v=e[k].to;k++;if(getfa(u)!=getfa(v)){
//                  cout<<"!!"<<getfa(u)<<" "<<fa[u]<<endl;sum+=setnum[fa[v]]*setnum[fa[u]];    setnum[fa[v]]+=setnum[fa[u]]; fa[fa[u]]=fa[v];//这个顺序重要,一定要是先处理完再合并,不要以为fa没影响。//因为先合并的话,如果某个元素的祖先刚好是自己,那么这个元素就是先跑到了别人家再合并的,大小也是用的别人的大小 }}ans[p[i].id]=sum;}for(int i=1;i<=q;i++) cout<<ans[i]<<endl;}return 0;
}

CF K. City相关推荐

  1. The 15th Chinese Northeast Collegiate Programming Contest K.City

    目录 题目: 思路:​​​​​​​ 代码: 题目: 原题: Lucida occupies n cities connected by m undirected roads, and each roa ...

  2. CF :K 一个含n条边的带权无向连通图,q次查询,每次查询两点间的最短距离。...

    题意:给你一个含n条边的带权无向连通图,q次查询,每次查询两点间的最短距离. 思路:LCA+思维. 设a,b两点间的距离为f(a,b) 则f(a,b)=dis[a]+dis[b]-2*dis[lca( ...

  3. The 15th Chinese Northeast Collegiate Programming Contest - K.City

    虽然不难,但是感觉很有意思的一道题,下面有几个点感觉还是挺妙的: · 并查集只能加边不能减边: ·对数据进行离线处理,方便我们进行排序处理(后面会解释): 首先数据的范围很大,如果我们每做一次判断都要 ...

  4. 上映 10 天,票房就突破 10 亿的《海王》真的有那么好看?

    出品:CSDN(ID:CSDNnews) 写在前面 本文将主要通过Python加上一些数据分析,来证明<海王>好看. <海王>一部电影带你重温<驯龙高手><变 ...

  5. CodeChef TWOROADS(计算几何+拉格朗日乘数法)

    题面 传送门 简要题意:给出\(n\)个点,请求出两条直线,并最小化每个点到离它最近的那条直线的距离的平方和,\(n\leq 100\) orz Shinbokuow 前置芝士 给出\(n\)个点,请 ...

  6. Cassandra 的数据存储结构——本质是SortedMapRowKey, SortedMapColumnKey, ColumnValue

    Cassandra 的数据存储结构 Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型.它借鉴了 Amazon 的 Dynamo 和 Google's BigTab ...

  7. jquery书写一个简易的二级联动

    先用php生成一个json数组示例如下 JSON_UNESCAPED_UNICODE 是对汉字进行处理的参数 然后HTML代码如下 把那个json_city赋值成我们用php生成的json即可 < ...

  8. 微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”...

    微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友 ...

  9. Mr. Main and Windmills 模拟,计算几何(昆明)

    O(nmlogn)O(nmlogn)O(nmlogn),这么一算都1e8了 long double,但好像double也可以过 #include <iostream> #include & ...

最新文章

  1. 【Live555】live555源码详解(六):FramedSource、RTPSource、RTPSink
  2. struts 数据库连接
  3. jquery实现停留半秒后再选择
  4. 拿到大厂产品经理offer的应届生都是什么水平?
  5. JAVA调用C语言写的SO文件
  6. 【C语言简单说】八:分支结构之if...else if()...else...(3)
  7. LeetCode MySQL 262. 行程和用户
  8. 视频预训练界的HERO!微软提出视频-语言全表示预训练模型HERO,代码已开源!...
  9. Linux系统升级维护费,Antergos Linux 宣布停止维护
  10. django settings 定义的变量不存在_Django基础框架搭建
  11. AVIator -- Bypass AV tool
  12. 在自己的项目中调用别人的库的方法(static lib库,dynamic lib库以及dll动态库)
  13. 手机开热点但是电脑一直连接不上_电脑连接不上手机热点解决办法
  14. Entrepreneur\'s Credo of the American 美国的企业家宣言
  15. 【安全问道】系列:阿里带你3分钟掌握一个互联网安全知识
  16. php数据库redios_PHP开发者应了解的24个库
  17. Python-Opencv fitLine 拟合直线
  18. Redis(三)【五大数据类型三种特殊数据类型】
  19. 蓝牙音频芯片,在交通灯提示语音更换的应用解析,WT2605X
  20. [OHIF-Viewers]医疗数字阅片-医学影像-Cornerstone Tools

热门文章

  1. 一、(1):开题后的内容整体把握--多目标检测综述
  2. 安装linux后错误1962,安装mysql出错make[2]: *** [mysql.o] 错误 1???
  3. PAT乙级——1086(字符串操作)java实现
  4. echarts使用指南
  5. javaScript学习笔记:用城市代码查询城市天气
  6. 大数据风控---身份反欺诈信贷全流程常用指标及策略
  7. JLink、JTAG接口详细图解
  8. 我印象里的一些 IT 大公司
  9. 一个简单的Java抽奖程序
  10. 深度学习笔记:在小数据集上从头训练卷积神经网络