HDU 4750 Count The Pairs
2015-08-12 14:05
393 查看
#include <stdio.h> #include <string.h> #include <algorithm> #define maxn 500010 using namespace std; int par[10010], rank1[10010], a[maxn], b[maxn]; long long int sum[maxn]; void init(int n){ for(int i = 0;i < n;i++){ par[i] = -1; rank1[i] = 1; } } int find(int x){ if(par[x] == -1) return x; else return par[x] = find(par[x]); } void unite(int x, int y){ x = find(x); y = find(y); if(x != y) { par[x] = y; rank1[y] += rank1[x]; } } struct node { int u, v, l; }edge[maxn]; bool cmp(node a, node b){ return a.l < b.l; } int main() { int i, n, m, p, tp, id; while(scanf("%d %d", &n, &m) != EOF) { for(i = 0;i < m;i++) scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].l); init(n); sort(edge, edge + m, cmp); for(i = 0;i < m;i++) { b[i] = edge[i].l; int u = edge[i].u; int v = edge[i].v; if(find(u) != find(v)) { a[i] = 2*rank1[find(u)]*rank1[find(v)]; unite(u, v); } else a[i] = 0; } sum[m] = 0; for(i = m - 1;i >= 0;i--) sum[i] = sum[i + 1] + a[i]; scanf("%d", &p); for(i = 0;i < p;i++) { scanf("%d", &tp); id = lower_bound(b, b + m, tp) - b; if(id >= m) printf("0\n"); else printf("%lld\n", sum[id]); } } return 0; }
相关文章推荐
- 1086. Tree Traversals Again (25)
- 1086. Tree Traversals Again (25)
- hdu 3571 Hotaru's problem || 2015 Multi-University Training Contest 7 (manacher算法)
- 217 Contains Duplicate
- hdu 1532 Drainage Ditches 最大流 dinic算法
- hdu 1532 Drainage Ditches 最大流 dinic算法
- 一个简单的wed服务器SHTTPD(9)————main函数文件,Makefile,头文件
- Post方法调用公司发Mail的接口
- 关于List contains方法的一些使用心得
- Hdu 2015 Multi-University Training Contest7
- IO操作演示(DataInputStream、DataOutputStream)
- leetCode #70 Climbing Stairs
- hdu4770:Lights Against Dudely(回溯 + 修剪)
- await/signal/lock实现生产消费者模式
- wait/notify实现生产消费者模式
- CoreData之条件查询 contains
- LeetCode题解:Contains Duplicate II
- CoreData之条件查询 contains
- LeetCode题解:Contains Duplicate
- Dynamics CRM 开启EmailRouter日志记录