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 ...
随机推荐
- PHP curl_pause函数
curl_pause — 暂停及恢复连接. 说明 int curl_pause ( resource $ch , int $bitmask ) 参数 ch 由 curl_init() 返回的 cURL ...
- PHP【Laravel】delayer基于redis的实现订单超时改变状态
实现这个功能前你需要知道以下,不然可能会比较吃力:1.服务器的计划任务,shell脚本,或者你有宝塔自带的计划任务会方便很多.2.有所了解Redis.3.会写PHP业务逻辑. 好了进入在正题,这里使用 ...
- Stream流式编程
Stream流式编程 Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定“流”就一定是“IO流”呢?在Java 8中,得益于Lambda所带来的函数式编程,引入了一个 ...
- python自动化之函数封装
函数最重要的目的是方便我们重复使用相同的一段程序. 将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句. 前面一些记录了selenium的各种API ...
- 1、jQuery操作Dom
1.添加元素 <code> <script language="JavaScript">$().ready(function(){$("input ...
- 【Java多线程系列七】ExecutorService
java.util.concurrent.ExecutorService接口提供了许多线程管理的方法 Method 说明 shutdown 拒绝接收新的任务,待已提交的任务执行后关闭,且宿主线程不阻塞 ...
- Jackson教程
Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象.Jackson所依赖的jar包较少,简 ...
- 转 jmeter 等待时间 pacing think time
第一部分:Request之间的等待时间的设置 先明确一些概念:1)定时器是在每个sampler(采样器)之前执行的,而不是之后:是的,你没有看错,不管这个定时器的位置放在sampler之后,还是之下, ...
- CF1220F
CF1220F 把整棵树分成1的左边和1的右边两部分 最优情况两边子树深度的差一定可以是一 如果还可以是2,也可以通过把多的那一边的点往另一边移使他变成1 如果往一个端点加点,一定不会使这一边变优,也 ...
- 事件循环--eventloop
一.什么是事件循环? 事件循环是 JS 实现异步的具体解决方案,同步代码直接执行,异步函数或代码块先放在异步队列中,待同步函数执行完毕,轮询执行异步队列的函数. 事件循环 二.node.js中的事件循 ...