2015 ACM/ICPC Asia Regional Changchun Online HDU - 5441 (离线+并查集)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5441
题意:给你n,m,k,代表n个城市,m条边,k次查询,每次查询输入一个x,然后让你一个城市对(u,v)满足两点之间每一条边都不超过x,问有多少对
思路:首先我想到的是dfs求出每个查询小于等于他的一个连通块,然后num*(num-1)就是答案,但是时间只有一秒,这个复杂度是5*1e8,超时了(亲身体验了)
然后我们想这个是离线的,我们可不可以由小到大来推,这样前面的贡献到后面就依然能用了,但是我们怎么修改dfs呢,发现dfs现在已经不支持这个条件了
就只能用另一个处理连通块的算法并查集,我们用一个数组记录每个点作为父亲头连通块里有多少个点,然后我们还要想想
我们如果后面这个查询没有加入新的边来产生新的连通块,那么他的权值和就是前面那个查询
如果当前这个查询只是加入了一条边来产生新的连通块,那么我们就把受影响的两个连通块的权值减掉再加上新的连通块的权值即可
以此类推
(sl[xx]+sl[yy])*(sl[xx]+sl[yy]-1)-(sl[xx])*(sl[xx]-1)-(sl[yy])*(sl[yy]-1)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#define maxn 100005
#define mod 1000000007
using namespace std;
typedef long long ll;
struct sss
{
int x,y,z;
}a[maxn];
struct www
{
int id;
int v;
ll sum;
}b[];
int n,m,k;
int pre[maxn];
ll sl[maxn];
set<int> s;
int cmp(struct sss x,struct sss y)
{
return x.z<y.z;
}
int cmp1(struct www x,struct www y){
return x.v<y.v;
}
int cmp2(struct www x,struct www y){
return x.id<y.id;
}
int find(int x){
if(x==pre[x]) return x;
else return pre[x]=find(pre[x]);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(b,,sizeof(b));
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++)
{
pre[i]=i;
sl[i]=;
s.insert(i);
}
int x,y,z;
for(int i=;i<m;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
}
sort(a,a+m,cmp);
ll sum=;
for(int i=;i<=k;i++){
b[i].id=i;
scanf("%d",&b[i].v);
}
sort(b+,b+k+,cmp1);
int num=;
for(int i=;i<=k;i++){
int flag=;
b[i].sum=b[i-].sum;
for(;num<m;num++){
if(a[num].z<=b[i].v){
int xx=find(a[num].x);
int yy=find(a[num].y);
if(xx!=yy)
{
b[i].sum+=(sl[xx]+sl[yy])*(sl[xx]+sl[yy]-)-(sl[xx])*(sl[xx]-)-(sl[yy])*(sl[yy]-);//核心语句
pre[xx]=yy;
sl[yy]+=sl[xx];//更新连通块个数
s.erase(xx);
}
}
else break;
}
}
sort(b+,b+k+,cmp2);
for(int i=;i<=k;i++){
printf("%lld\n",b[i].sum);
}
}
}
2015 ACM/ICPC Asia Regional Changchun Online HDU - 5441 (离线+并查集)的更多相关文章
- 2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )
http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others) Memo ...
- (二叉树)Elven Postman -- HDU -- 54444(2015 ACM/ICPC Asia Regional Changchun Online)
http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Time Limit: 1500/1000 MS (Java/Others) ...
- hdu 5444 Elven Postman(二叉树)——2015 ACM/ICPC Asia Regional Changchun Online
Problem Description Elves are very peculiar creatures. As we all know, they can live for a very long ...
- (线段树 区间查询)The Water Problem -- hdu -- 5443 (2015 ACM/ICPC Asia Regional Changchun Online)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=5443 The Water Problem Time Limit: 1500/1000 MS (Java/ ...
- Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)
题目链接: Hdu 5442 Favorite Donut 题目描述: 给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果 ...
- Hdu 5446 Unknown Treasure (2015 ACM/ICPC Asia Regional Changchun Online Lucas定理 + 中国剩余定理)
题目链接: Hdu 5446 Unknown Treasure 题目描述: 就是有n个苹果,要选出来m个,问有多少种选法?还有k个素数,p1,p2,p3,...pk,结果对lcm(p1,p2,p3.. ...
- hdu 5444 Elven Postman(根据先序遍历和中序遍历求后序遍历)2015 ACM/ICPC Asia Regional Changchun Online
很坑的一道题,读了半天才读懂题,手忙脚乱的写完(套上模板+修改模板),然后RE到死…… 题意: 题面上告诉了我们这是一棵二叉树,然后告诉了我们它的先序遍历,然后,没了……没了! 反复读题,终于在偶然间 ...
- HDU 5437 Alisha’s Party (优先队列)——2015 ACM/ICPC Asia Regional Changchun Online
Problem Description Princess Alisha invites her friends to come to her birthday party. Each of her f ...
随机推荐
- vue 前后端分离 接口及result规范 及drf安装使用方法
接口 # 接口:url链接,通过向链接发送不同的类型请求与参数得到相应的响应数据# 1.在视图层书写处理请求的 视图函数# 2.在路由层为视图函数配置 url链接 => 产生接口# 3.前台通 ...
- svn服务端安装、迁移教程、Eclipse切换svn连接库
svn服务端安装.迁移教程.Eclipse切换svn连接库 安装教程 1.下载svn服务端安装程序 2.运行程序,安装 这里端口号根据自己定义,避免与其他程序冲突 到这里就安装完成 迁移教程 这里举例 ...
- 数组转xls格式的excel文件&数据转csv格式的excle
/** * 数组转xls格式的excel文件 * @param array $data 需要生成excel文件的数组 * @param string $filename 生成的excel文件名 * 示 ...
- 常用跨域方法总结(2)——CORS
常用跨域方法总结(2)--CORS 上篇文章介绍了几种常用的跨域方法:常用跨域方法总结,本片为上一篇的补充,对比较重要的Cross Origin Resource Sharing详细介绍. CORS ...
- Django中get()和fiter()的区别
QuerySet(查询结果集对象):从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet,也就是指服务器上的url里面的查询内容.Django会对查询返回的结果集QuerySet进行 ...
- ArcGIS Runtime SDK for .NET (Quartz Beta)之连接ArcGIS Portal
1. 介绍 ArcGIS Portal作为ArcGIS平台的中枢,在ArcGIS体系中起着至关重要的地位.在ArcGIS Runtime的新架构Quartz中添加了连接ArcGIS Portal(或A ...
- share memory cache across multi web application
Single instance of a MemoryCache across multiple application pools on the same server [duplicate] Yo ...
- Hexo next博客的pjax一个Bug引发的关于pjax用法的小技巧-----pjax后图片点击放大的js失效
文章目录 广告: 背景 发现 解决 get技能 广告: 本人博客地址:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.git ...
- OA集成备注
1. 查看轨迹方法<script type="text/javascript"> function WinOpenIt(url) { //alert(1); var t ...
- jekyll介绍安装.github静态页面工具
jekyll build # => 当前文件夹中的内容将会生成到 ./site 文件夹中. $ jekyll build --destination <destination> # ...