题目: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 (离线+并查集)的更多相关文章

  1. 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 ...

  2. (并查集)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 ...

  3. (二叉树)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)  ...

  4. 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 ...

  5. (线段树 区间查询)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/ ...

  6. Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)

    题目链接: Hdu 5442 Favorite Donut 题目描述: 给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果 ...

  7. 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.. ...

  8. hdu 5444 Elven Postman(根据先序遍历和中序遍历求后序遍历)2015 ACM/ICPC Asia Regional Changchun Online

    很坑的一道题,读了半天才读懂题,手忙脚乱的写完(套上模板+修改模板),然后RE到死…… 题意: 题面上告诉了我们这是一棵二叉树,然后告诉了我们它的先序遍历,然后,没了……没了! 反复读题,终于在偶然间 ...

  9. 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 ...

随机推荐

  1. 最短路 Dijkstra模板

    普通dijkstra,复杂度O(n*n) #include<bits/stdc++.h> using namespace std; int n,m,f[105][105],dis[105] ...

  2. python sum()函数的用法

    sum() 方法对系列进行求和计算.针对元组,列表.对字符串会报错 >>>sum([0,1,2]) 3 >>> sum((2, 3, 4), 1) # 元组计算总和 ...

  3. 网页打开qq

    网页打开qq 打开qq方法tencent://message/?uin=”+“541239271”+“&Menu=yes http://wpa.qq.com/msgrd?V=1&uin ...

  4. GDB can't continue if no space left

    [root@premta ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/sda3 36G 36G 0 100% /tmpfs 1.5G ...

  5. JWT工具类

    package com.ynhrm.common.utils; import io.jsonwebtoken.Claims;import io.jsonwebtoken.JwtBuilder;impo ...

  6. 转 jmeter 关联

    jmeter(十二)关联之正则表达式提取器   如果有这样的情况:一个完整的操作流程,需要先完成某个操作,获得某个值或数据信息,然后才能进行下一步的操作(也就是常说的关联/将上一个请求的响应结果作为下 ...

  7. Scrapy框架: pipelines.py设置

    保存数据到json文件 # -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your p ...

  8. 牛客小白月赛18 G Forsaken的三维数点

    思路: 这是一道树状数组和二分的题,用线段树空间直接爆,时间也会超 然后这道题我犯了一个很低级的错误,导致我wa了十发左右,一个int型变量用lld输入,然后他给的提示是运行错误,我哭了,我一直以为是 ...

  9. Python之内建函数

    常用内置函数: abs(): 绝对值 divmod():   取商和模 pow(): 指数运算 round():   返回浮点数 callable(): 判断函数是否可调用 isinstance(): ...

  10. 在Ubuntu下安装deb包需要使用dpkg命令

    Dpkg 的普通用法: 1.sudo dpkg -i <package.deb> 安装一个 Debian 软件包,如你手动下载的文件. 2.sudo dpkg -c <package ...