HDU5441 Travel (离线操作+并查集)
Travel
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2055 Accepted Submission(s): 709
bidirectional roads connecting the cities. Jack hates waiting too long
on the bus, but he can rest at every city. Jack can only stand staying
on the bus for a limited time and will go berserk after that. Assuming
you know the time it takes to go from one city to another and that the
time Jack can stand staying on a bus is x minutes, how many pairs of city (a,b) are there that Jack can travel from city a to b without going berserk?
For each test case, the first line consists of three integers n,m and q where n≤20000,m≤100000,q≤5000. The Undirected Kingdom has n cities and m bidirectional roads, and there are q queries.
Each of the following m lines consists of three integers a,b and d where a,b∈{1,...,n} and d≤100000. It takes Jack d minutes to travel from city a to city b and vice versa.
Then q lines follow. Each of them is a query consisting of an integer x where x is the time limit before Jack goes berserk.
Note that (a,b) and (b,a) are counted as different pairs and a and b must be different cities.
5 5 3
2 3 6334
1 5 15724
3 5 5705
4 3 12382
1 3 21726
6000
10000
13000
6
12
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <ctime>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <set>
using namespace std; const int INF=0x3f3f3f3f;
const double eps=1e-;
const double PI=acos(-1.0);
#define maxn 5500
#define maxx 26000
#define maxm 160000 struct Edge
{
int u,v,w;
}edge[maxm];
struct Id
{
int s, id;
}ans[maxn];
int n,cnt1; int root[maxx],num[maxx],cnt[maxn];
int vis[maxx]; int cmp(Edge a,Edge b)
{
return a.w < b.w;
}
int cmp1(Id a, Id b)
{
return a.s < b.s;
}
int cmp2(Id a, Id b)
{
return a.id < b.id;
}
void init()
{
for(int i = ; i <= n; i++)
{
root[i] = i;
num[i] = ;
}
}
int find_root(int x)
{
if(x != root[x])
root[x] = find_root(root[x]);
return root[x];
}
int cot;
void uni(int a, int b)
{
int x = find_root(a);
int y = find_root(b);
if(x != y)
{
root[y] = x;
int p1 = num[x];
int p2 = num[y];
cot -= p1*(p1-);
cot -= p2*(p2-);
num[x] += num[y];
cot += num[x] * (num[x]-);
num[y] = ;
}
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int m,q;
scanf("%d%d%d", &n, &m, &q);
for(int i = ; i < m; i++)
scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w);
init();
sort(edge, edge+m, cmp);
for(int i = ; i < q; i++)
{
scanf("%d", &ans[i].s);
ans[i].id = i;
}
sort(ans, ans+q, cmp1);
memset(vis, , sizeof vis);
cnt1 = ;
int cnt2 = ;
cot = ;
//memset(cnt, 0, sizeof cnt);
for(int i = ; i < m; i++)
{
if(cnt2 == q)
break;
// if(edge[i].w <= ans[cnt2].s)
// uni(edge[i].u, edge[i].v);
// else
for(int j = cnt2; cnt2 < q; cnt2++)
{
if(edge[i].w <= ans[cnt2].s)
{
uni(edge[i].u, edge[i].v);
break;
}
ans[cnt2].s = cot;
} }
int temp;
if(cnt2 == )
temp = cot;
else
temp = ans[cnt2-].s;
if(cnt2<q)
for(int i = cnt2; i < q; i++)
ans[i].s = temp; sort(ans, ans+q, cmp2);
for(int i = ; i < q; i++)
printf("%d\n", ans[i].s);
}
return ;
}
HDU5441 Travel (离线操作+并查集)的更多相关文章
- HDU5441 Travel 离线并查集
Travel Problem Description Jack likes to travel around the world, but he doesn’t like to wait. Now, ...
- 【BZOJ-1576】安全路径Travel Dijkstra + 并查集
1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1044 Solved: 363[Sub ...
- HDU 5441——Travel——————【并查集+二分查界限】
Travel Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Su ...
- HDU 5441 Travel (并查集+数学+计数)
题意:给你一个带权的无向图,然后q(q≤5000)次询问,问有多少对城市(城市对(u,v)与(v,u)算不同的城市对,而且u≠v)之间的边的长度不超过d(如果城市u到城市v途经城市w, 那么需要城市u ...
- HDU 5441 Travel(并查集+统计节点个数)
http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给出一个图,每条边有一个距离,现在有多个询问,每个询问有一个距离值d,对于每一个询问,计算出有多少点 ...
- poj1733 带权并查集
题意:有一个 0/1 数列,现在有n组询问和回答,表示某个区间内有奇数或者偶数个1,问到前多少个都没有逻辑错误,而下一个就不满足 可以定奇数为 1 偶数为 0作为每个元素的权值,表示它与它的祖先元素的 ...
- hdu 5441 travel 离线+带权并查集
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Descript ...
- hdu 5441 Travel 离线带权并查集
Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...
- Travel(HDU 5441 2015长春区域赛 带权并查集)
Travel Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Su ...
随机推荐
- Reverse Linked List II 解答
Question Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Giv ...
- OPStackComputeNodeMaintain
1,yum -y install openstack-nova-compute计算节点配置完成后 其配置文件默认非注释行内容如下;
- <转载>僵尸进程
转载http://www.cnblogs.com/scrat/archive/2012/06/25/2560904.html 什么是僵尸进程 僵尸进程是指它的父进程已经退出(父进程没有等待(调用wai ...
- class、interface、struct的差别
1 struct和class有什么差别 1.1默认的继承訪问权限 Struct是public的,class是private的. 你能够写例如以下的代码: struct A { char a; }; s ...
- Canvas Api简介1
canvas canvas 其实对于HTML来说很简单,只是一个标签元素而已,自己并没有行为,但却把一个绘图 API 展现给客户端 JavaScript 以使脚本能够把想绘制的东西都绘制到一块画布上, ...
- JSP基础学习(二)
1.JSP页面的内容组成 静态部分:标准的HTML标签.静态的页面内容,这些内容与静态的HTML页面相同 动态部分:这些由java程序来动态生成 2.<% out.println(new jav ...
- linux字体安装
Google查了一下,果然Windows下的ttf字体与GNOME是兼容的!我立即确定了我的方案——使用Windows下的“微软雅黑”体作为桌面和应用程序的默认字体! 1. 首先获得一套“微软雅黑”字 ...
- MRC BlOCK ARC
/*-------------------MRC环境中-------------------------*/ //使用局部变量:a到block块中,为了在block中能够使用这个变量,将 ...
- 1215.1——动态分配内存的补充realloc
当再次在原来申请的内存基础上再加内存的时候用realloc,如果第一次分配的内存后面存储地方够用,则连着原来的申请,如果不够用,就重新找到一块够用的地方,然后把原来的复制过去 int main(int ...
- (转) Overloads and templates
Overloaded functions In C++, two different functions can have the same name if their parameters are ...