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 ...
随机推荐
- Java中如何修改Jar中的内容
一.摘要 好长时间没写blog了,之前换了一家公司.表示工作更有战斗力了,可惜就是没时间写文章了.在这段时间其实是遇到很多问题的,只是都是记录下来,并没有花时间去研究解决.但是这周遇到这个问题没办法让 ...
- Database基础(一):构建MySQL服务器、 数据库基本管理 、MySQL 数据类型、表结构的调整
一.构建MySQL服务器 目标: 本案例要求熟悉MySQL官方安装包的使用,快速构建一台数据库服务器: 安装MySQL-server.MySQl-client软件包 修改数据库用户root的密码 确认 ...
- redis集群-4
redis集群原理 redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态.每个节点都和其 ...
- 通过findViewById()方法从layout中获取view并进行相应的转换时提示:"Cannot cast from View to AutoCompleteTextView"的解决办法!(转+自己错误)
转:http://blog.csdn.net/zyz511919766/article/details/7453864 代码: package zyz.example.autocompletetext ...
- js判断是否pc端
function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ['Android', 'iPhone', 'Symbi ...
- jquery+javascript触发a标签的点击事件
今天项目经理跟我说window.open()在一些浏览器上会被拦截,当时的解决方案是:用a标签的target="_blank"属性也可以打开窗体页面 于是解决了A问题出现了B问题: ...
- 洛谷 P1742 最小圆覆盖 (随机增量)
题目链接:P1742 最小圆覆盖 题意 给出 N 个点,求最小的包含所有点的圆. 思路 随机增量 最小圆覆盖一般有两种做法:随机增量和模拟退火.随机增量的精确度更高,这里介绍随机增量的做法. 先将所有 ...
- PHP数组循环遍历的几种方式
PHP数组循环遍历 1.for循环 <?php //语法 for (init counter; test counter; increment counter) { code to be exe ...
- Cocos2d-x在Windows平台环境的搭建
| 版权声明:本文为博主原创文章,未经博主允许不得转载. windows平台下配置Cocos2d-X引擎所需的压缩文件和可执行文件,如下: 下载链接: adt: http://tools.a ...
- 2059-authentication plugin 'caching_sha2_password"cnnot bt loaded :mysql8.0数据库连接不上(Navicat)
原因:8.0改变了 身份验证插件 , 打开 my.ini (或者my.cofg) 可以看到变更了 5.7及其以前的方式:mysql_native_password 办法: 1:命令行键入数据库: my ...