首页 > 其他分享 >HDU 1856 More is better(并查集+离散化)

HDU 1856 More is better(并查集+离散化)

时间:2023-04-13 17:40:54浏览次数:50  
标签:bin f1 HDU int 查集 mid 1856 include find1

题目地址:HDU 1856

水题。由于标号范围太大,而数据数只有10w,所以要先进行离散化。然后就是裸的并查集了。

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
int bin[100001], x[100001], y[100001], z[200001], c[200001], cnt, vis[200000];
int find1(int x)
{
    return bin[x]==x?x:bin[x]=find1(bin[x]);
}
void merger(int x, int y)
{
    int f1=find1(bin[x]);
    int f2=find1(bin[y]);
    if(f1!=f2)
        bin[f2]=f1;
}
int twofen(int x)
{
    int high=cnt-1, low=0, mid;
    while(low<=high)
    {
        mid=low+high>>1;
        if(c[mid]==x) return mid;
        else if(c[mid]<x) low=mid+1;
        else high=mid-1;
    }
}
int main()
{
    int n, i, max1, a, b, f1, f2;
    while(scanf("%d",&n)!=EOF)
    {
        cnt=1;
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&x[i],&y[i]);
            z[2*i]=x[i];
            z[2*i+1]=y[i];
        }
        sort(z,z+2*n);
        c[0]=z[0];
        for(i=1;i<2*n;i++)
        {
            if(z[i]!=z[i-1])
                c[cnt++]=z[i];
        }
        for(i=0;i<cnt;i++)
            bin[i]=i;
        for(i=0;i<n;i++)
        {
            f1=twofen(x[i]);
            f2=twofen(y[i]);
            merger(f1,f2);
        }
        memset(vis,0,sizeof(vis));
        max1=-1;
        for(i=0;i<cnt;i++)
        {
            int p=find1(bin[i]);
            vis[p]++;
            if(max1<vis[p])
                max1=vis[p];
        }
        printf("%d\n",max1);
    }
    return 0;
}


标签:bin,f1,HDU,int,查集,mid,1856,include,find1
From: https://blog.51cto.com/u_16070138/6188249

相关文章

  • HDU 2473 Junk-Mail Filter(并查集的删除操作)
    题目地址:HDU2473这题以前碰到过,没做出来。。现在又做了做,还是没做出来。。、、这题涉及到并查集的删除操作。想到了设一个虚节点,但是我把虚节点设为了要删除的点的父节点,一直是栈溢出,目测是无限递归了。看了看别人的做法,原来只要建一个映射就可以了,虚节点是作为的新的映射,每......
  • HDU 2120 Ice_cream's world I(并查集)
    题目地址:HDU2120这题虽然字数不多,但就是看不懂。。意思是求最多有多少个被墙围起来的区域。显然就是求环的个数。然后用并查集求环个数就可以了。代码如下:#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<stdlib.h>#include<math......
  • HDU 2604 Queuing(矩阵快速幂)
    题目地址:HDU2604这题只要推出公式来,构造矩阵就很容易了,问题是推不出公式来。。TAT。。从递推的思路考虑,用f(n)表示n个人满足条件的结果,如果最后一个是m则前n-1人可以任意排列,有f(n-1)种;如果是f,则考虑后两位mf和ff,没有一定满足或者一定不满足的状态,所以继续考虑一位,考虑后三位......
  • HDU 1588 Gauss Fibonacci(矩阵快速幂)
    题目地址:HDU1588用于构造斐波那契的矩阵为1,11,0设这个矩阵为A。sum=f(b)+f(k+b)+f(2*k+b)+f(3*k+b)+........+f((n-1)*k+b)<=>sum=A^b+A^(k+b)+A^(2*k+b)+A^(3*k+b)+........+A^((n-1)*k+b)<=>sum=A^b+A^b*(A^k+A^2*k+A^3*k+.......+A^((n-1)*k))(1)设矩阵B为A^k;那么(1......
  • HDU 3306 Another kind of Fibonacci(矩阵快速幂)
    题目地址:HDU3306没什么智商的题目,只要把构造矩阵硬算出来就行。代码如下:#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<stdlib.h>#include<math.h>#include<ctype.h>#include<queue>#include<......
  • (KMP 1.1)hdu 1711 Number Sequence(KMP的简单应用——求pattern在text中第一次出现的
    题目:NumberSequenceTimeLimit:10000/5000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):12902    AcceptedSubmission(s):5845ProblemDescriptionGiventwosequencesofnumbers:a[1],a[2],......,a[N],andb[1......
  • hdu-4533(线段树+区间合并)
    约会安排HDU-4553跟hdu-1540(线段树+区间合并)-魏老6-博客园(cnblogs.com)是一样,但是要写两个线段树。线段树维护,最长前缀pre,最长后缀suf,以及最大连续连续区间sum。1代表空,0代表时间被占了还有几个注意事项:当是DS时,只能查询和修改屌丝树;当是NS时,先判断屌丝树能不......
  • hdu-1540(线段树+区间合并)
    TunnelWarfareHDU-1540思路:没被摧毁的村庄为1,否则为0,用len记录线段树维护区间的两个信息:前缀最长1的序列pre后缀最长1的序列suf父节点与左右子节点的关系://lc为左节点,rc为右节点1.若左右结点都不满1,则tr[p].pre=tr[lc].pre,tr[p].suf=tr[rc].suf2.若左节点满1,tr......
  • HDU - 3572 Task Schedule (最大流)
    题目大意:有N个任务,M台机器。每个任务有相应的起始时间,截至时间和完成时间每台机器一小时可以做1个单位的工作量,每个任务的完成可以不连续,但每次只能由一台机器完成问能否完成所有任务解题思路:因为只有500分钟,所以可以将每分钟都设成1条边,连向超级汇点,容量为M每个任务连接向......
  • HDU - 3338 Kakuro Extension(最大流 行列模型)
    题目大意:看一下图基本就知道了解题思路:难点是构图。。设置一个超级源点和所有的行的和相连,容量为该行的和-该行和由几个数相加得到,因为这里将0看成了,1看成了2,依此类推设置一个超级汇点,和所有列的和相连,容量为该列的和-该列和由几个数相加得到,和上面一样接着就是空白部分......