zoukankan      html  css  js  c++  java
  • HDU 1856 More is better

    这题。。刚开始看那个数字有点大,以为开不了那么大的数组(其实只有一千万,可以开,,被眼睛给欺骗了。。),结果用了一些容器来优化,结果发现所谓的“优化”过后时间花费还更多了,多了一倍, 虽然空间复杂度提高了10倍。。真是。果然是一个时间复杂度换空间复杂度的活生生的案例啊。。

    这题给我的收获:

    1.10000000的数组可以开。

    2.合并时,if(x == y) return; 最好加上,否则突然浪费时间,还有可能超时。

    代码:( 直接开数组版 78672KB  406ms )

    #include<stdio.h>
    int fa[10000001],rank[10000001];
    int findset(int x)
    {
        if(x != fa[x])
            fa[x] = findset(fa[x]);
        return fa[x];
    }
    void unionset(int x,int y)
    {
        x=findset(x);
        y=findset(y);
        if(x==y)
            return;
        if(rank[x] >= rank[y])
        {
            fa[y] = x;
            rank[x] += rank[y];
        }
        else if(rank[x] < rank[y])
        {
            fa[x] = y;
            rank[y] += rank[x];
        }
    }
    int main()
    {
        int n,i,j,maxi,a,b;
        while(scanf("%d",&n)!=EOF)
        {
            for(i=0;i<10000000;i++)
            {
                fa[i]=i;
                rank[i]=1;
            }
            for(i=1;i<=n;i++)
            {
                scanf("%d%d",&a,&b);
                unionset(a,b);
            }
            maxi=rank[0];
            for(i=1;i<10000000;i++)
                if(maxi<rank[i])
                    maxi=rank[i];
            printf("%d
    ",maxi);
        }
        return 0;
    }
    View Code

    代码:( 容器优化版  7576KB  890ms )

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <utility>
    #include <cstdlib>
    using namespace std;
    #define N 100100
    
    map<int,int> fa,num;
    vector<int> v,v2;
    
    struct node
    {
        int a,b;
    }pa[N];
    
    void makeset()
    {
        fa[v[0]] = v[0];
        num[v[0]] = 1;
        v2.push_back(v[0]);
        for(int i=1;i<v.size();i++)
        {
            if(v[i] != v[i-1])
            {
                v2.push_back(v[i]);
                fa[v[i]] = v[i];
                num[v[i]] = 1;
            }
        }
    }
    
    int findset(int x)
    {
        if(x != fa[x])
        {
            fa[x] = findset(fa[x]);
        }
        return fa[x];
    }
    
    void unionset(int a,int b)
    {
        int x = findset(a);
        int y = findset(b);
        if(x == y)
            return;
        if(num[x] >= num[y])
        {
            fa[y] = x;
            num[x] += num[y];
        }
        else
        {
            fa[x] = y;
            num[y] += num[x];
        }
    }
    
    int main()
    {
        int n,i;
        while(scanf("%d",&n)!=EOF)
        {
            for(i=1;i<=n;i++)
            {
                scanf("%d%d",&pa[i].a,&pa[i].b);
                v.push_back(pa[i].a);
                v.push_back(pa[i].b);
            }
            sort(v.begin(),v.end());
            makeset();
            for(i=1;i<=n;i++)
            {
                unionset(pa[i].a,pa[i].b);
            }
            int maxi = -1000000;
            for(i=0;i<=v2.size();i++)
            {
                if(fa[v2[i]] == v2[i])
                {
                    if(num[v2[i]] > maxi)
                        maxi = num[v2[i]];
                }
            }
            printf("%d
    ",maxi);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    02-02:springboot 整合filter
    02-01:springboot整合servlet开发
    01-SpringBoot项目:helloworld
    SpringBoot
    JavaScript面试题
    vue的生命周期
    小程序下的兼容性问题
    短短几行css代码实现滚动条效果
    Apache服务器的安装和配置
    闭包
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3508456.html
Copyright © 2011-2022 走看看