zoukankan      html  css  js  c++  java
  • [swustoj 1091] 土豪我们做朋友吧

    土豪我们做朋友吧(1091)

    问题描述:

    人都有缺钱的时候,缺钱的时候要是有个朋友肯帮助你,那将是一件非常幸福的事情。有N个人(编号为1到N),一开始他们互相都不认识,后来发生了M件事情,事情分为2个种类,1:A和B成为了朋友,并且A的所有朋友都成了B的朋友,B的所有朋友也都成了A的朋友。2:A缺钱了,请求帮助,他需要向他朋友中钱最多的请求帮助,若不止一位,选择编号最小的。

    输入:

    多组测试数据,每组第一行是整数N(2<=N<=100000),表示有N个人,第二行N个数据,依次表示每个人有多少钱,第三行是M(1<=M<=100000),表示发生了M个事件。接下来是M行,首先输入事件种类P(1或者2),然后是对应的两个或者一个整数A,B或者A。数据保证都在32位以内。

    输出:

    对于每一个事件2,输出A需要请求的人的编号,若没有人能够帮助他,输出"NO ONE CAN HELP!"。

    样例输入

    3
    1 2 3
    3
    2 1
    1 1 3
    2 1

    样例输出

    NO ONE CAN HELP!
    3
     
    并查集、维护最大和次大就是了
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define N 100010
    
    int n,m;
    int a[N];
    int f[N];
    pair<int,int> mx[N]; //最大的值、人
    pair<int,int> cx[N]; //次大的值、人
    pair<int,int> tmp[5];
    
    bool cmp(pair<int,int> a,pair<int,int> b)
    {
        if(a.first!=b.first) return a.first>b.first;
        return a.second<b.second;
    }
    void init()
    {
        for(int i=1;i<=n;i++)
        {
            f[i]=i;
            scanf("%d",&mx[i].first);
            mx[i].second=i;
            cx[i].first=-1;
            cx[i].second=-1;
        }
    }
    int Find(int x)
    {
        if(x!=f[x]) f[x]=Find(f[x]);
        return f[x];
    }
    void UN(int x,int y)
    {
        x=Find(x);
        y=Find(y);
        if(x==y) return;
        f[x]=y;
        tmp[0]=mx[x];tmp[1]=cx[x];
        tmp[2]=mx[y];tmp[3]=cx[y];
        sort(tmp,tmp+4,cmp);
        mx[x]=mx[y]=tmp[0];
        cx[x]=cx[y]=tmp[1];
    }
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            init();
            scanf("%d",&m);
            while(m--)
            {
                int op,a,b;
                scanf("%d%d",&op,&a);
                if(op==1)
                {
                    scanf("%d",&b);
                    UN(a,b);
                }
                else
                {
                    b=Find(a);
                    if(mx[b].first!=-1 && mx[b].second!=a)
                        printf("%d
    ",mx[b].second);
                    else if(cx[b].first!=-1)
                        printf("%d
    ",cx[b].second);
                    else
                        printf("NO ONE CAN HELP!
    ");
                }
            }
        }
        return 0;
    }
    趁着还有梦想、将AC进行到底~~~by 452181625
  • 相关阅读:
    UNITY 多个子MESH与贴图的对应关系
    UNITY 优化之带Animator的Go.SetActive耗时问题,在手机上,这个问题似乎并不存在,因为优化了后手机上运行帧率并未明显提升
    发现一个好办法-有问题可以到UNITY论坛搜索
    静态函数造成GC的原因
    关于GC.Collect在不同机器上表现不一致问题
    VULKAN学习资料收集
    Array.Resize(ref arry, size);
    玩游戏消耗精力
    浮点数与定点数问题
    P8 Visible Lattice Points
  • 原文地址:https://www.cnblogs.com/hate13/p/4486362.html
Copyright © 2011-2022 走看看