HUD 3938 protal [ 离线并查集 ]

传送们:HDU_3938 portal

思路:主要是实现处理数据,不然便超时,所谓离线处理。

还有注意,离线的姿势,用cnt+=uset[ u] *uset[ v],,如果重新处理所有的集合,重新算的话,又会超时。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;

int n,m,q;
int uset[10010];
int r1[50010],r2[50010];

struct qq{
    int L,p;
    int res;
}LL[10010];

int cmp1(qq a,qq b)
{
    return a.L<b.L;
}

int cmp2(qq a,qq b)
{
    return a.p<b.p;
}

struct node{
    int u,v;
    int c;
}p[50010];

int cmp(node a,node b)
{
    return a.c<b.c;
}
void make_set(int nn)
{
    for(int i=1;i<=nn;i++)
        uset[i]=-1;
}

int find_set(int x)
{
    if(uset[x]<0) return x;
    uset[x]=find_set(uset[x]);
    return uset[x];
}

int union_set(int x,int y)
{
    int cnt;
    if((x=find_set(x))==(y=find_set(y)))
        return 0;
    if(uset[x]<uset[y])
    {
        cnt=uset[x]*uset[y];
        uset[x]+=uset[y];
        uset[y]=x;
    }
    else
    {
        cnt=uset[x]*uset[y];
        uset[y]+=uset[x];
        uset[x]=y;
    }

    return cnt;
}

int main()
{
    while(scanf("%d%d%d",&n,&m,&q)!=EOF)
    {
        int pos=0;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].c);
        }
        for(int i=0;i<q;i++)
        {
            scanf("%d",&LL[i].L);
            LL[i].p=i;

        }

        sort(p,p+m,cmp);
        p[m].c=-1;
        sort(LL,LL+q,cmp1);
        make_set(n);
        int cnt=0;
        for(int i=0;i<q;i++)
        {
            while(LL[i].L>=p[pos].c&&pos<m)
            {
                cnt+=union_set(p[pos].u,p[pos].v);
                pos++;
            }
            LL[i].res=cnt;
        }
        sort(LL,LL+q,cmp2);
        for(int i=0;i<q;i++)
           printf("%d\n",LL[i].res);
    }
    return 0;
}
时间: 2024-10-10 02:26:08

HUD 3938 protal [ 离线并查集 ]的相关文章

CSUOJ 1601 War (离线并查集求连通块个数)

1601: War Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 130  Solved: 38 [Submit][Status][Web Board] Description AME decided to destroy CH's country. In CH' country, There are N villages, which are numbered from 1 to N. We say two village A and B ar

ACM学习历程—Hihocoder 1291 Building in Sandbox(dfs &amp;&amp; 离线 &amp;&amp; 并查集)

http://hihocoder.com/problemset/problem/1291 前几天比较忙,这次来补一下微软笔试的最后一题,这题是这次微软笔试的第四题,过的人比较少,我当时在调试B题,没时间看这一题.不过打过之前一场BestCoder的应该都会有点思路,虽然BC那题是二维,这题是三维的,但是思路应该是一样的,没错,就是离线加并查集. 正过来考虑的时候,发现第一个要求相邻块是好处理的,但是第二个要求能否到达(1000, 1000, 1000)这个条件似乎比较难判断,当时BC上的题根据题

HDU-5441 Travel 离线-并查集

Travel Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 4680    Accepted Submission(s): 1532 Problem Description Jack likes to travel around the world, but he doesn't like to wait. Now, he is t

hdu 3938 Portal(并查集+离线+kruskal)

搜了题解才把题搞明白.明白之后发现其实题意很清晰,解题思路也很清晰,只是题目表述的很不清晰…… 大意如下—— 给你一个无向图,图中任意两点的距离是两点间所有路径上的某一条边,这条边需要满足两个条件:1. 这条边这两点间某条路径上的最长边:2. 这条边是这两点间所有路径上的最长边中的最短边. 简单来说,假如a到d有两条路径,一条经过b,一条经过d,其中ab = 1, bd = 3, ac = 2, cd = 2,那么abd上的最长边为3,acd上的最长边为2,则ad的距离为2. 如果a, d两点间

集合问题 离线+并查集 HDU 3938

题目大意:给你n个点,m条边,q个询问,每条边有一个val,每次询问也询问一个val,定义:这样条件的两个点(u,v),使得u->v的的价值就是所有的通路中的的最长的边最短.问满足这样的点对有几个. 思路:我们先将询问和边全部都按照val排序,然后我们知道,并查集是可以用来划分集合的,所以我们就用并查集来维护每一个集合就行了. //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> using namespac

【杭电OJ3938】【离线+并查集】

http://acm.hdu.edu.cn/showproblem.php?pid=3938 Portal Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1921    Accepted Submission(s): 955 Problem Description ZLGG found a magic theory that the b

题解报告:zoj 3261 Connections in Galaxy War(离线并查集)

Description In order to strengthen the defense ability, many stars in galaxy allied together and built many bidirectional tunnels to exchange messages. However, when the Galaxy War began, some tunnels were destroyed by the monsters from another dimen

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,超时了(亲身体验了) 然后我们想这个是离线的,我们可不可以由小到大来推,这样前面的贡献到后面就依然能用了,但是我们

NOJ 1044 连通 OR 不连通 (离线并查集 + hash)

连通 OR 不连通 时间限制(普通/Java) :1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 333            测试通过 : 65 题目描述 给定一个无向图,一共n个点,请编写一个程序实现两种操作: D x y 从原图中删除连接x,y节点的边. Q x y 询问x,y节点是否连通 输入 第一行两个数n,m(5<=n<=40000,1<=m<=100000) 接下来m行,每行一对整数 x y (x,y<=