重新排列奶牛

C++

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N], b[N], p[N], s[N];
int find(int x)
{
    if(p[x] != x)p[x] = find(p[x]);
    return p[x];
}
int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; i ++)cin >> a[i];
    for(int i = 1; i <= n; i ++)
    {
        int x;
        cin >> x;
        b[x] = i;
    }
    for(int i = 1; i <= n; i ++)p[i] = i, s[i] = 1;
    for(int i = 1; i <= n; i ++)
    {
        int x = a[i], y = a[b[x]];
        if(find(x) != find(y))
        {
            s[find(y)] += s[find(x)];
            p[find(x)]  = find(y);
            
        }
    }
    int cnt = 0, mx = 0;
    for(int i = 1; i <= n; i ++)
    {
        if(find(i) == i && s[i] > 1)
        {
            cnt ++;
            mx = max(s[i], mx);
        }
    }
    if(!cnt)mx = -1;
        cout << cnt << " "<<mx<<endl;
    
}

Java

import java.util.*;
public class Main{
    public static int N = 110;
    public static int[] a = new int[N];
    public static int[] b = new int[N];
    public static int[] p = new int[N];
    public static int[] s = new int[N];
    public static void main(String[] args){
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        for(int i = 1; i <= n; i ++)a[i] = cin.nextInt();
        for(int i = 1; i <= n; i ++)
        {
            int x = cin.nextInt();
            b[x] = i;
        }
        for(int i = 1; i <= n; i ++){
            p[i] = i;
            s[i] = 1;
        }
        for(int i = 1; i <= n; i ++)
        {
            int x = a[i], y = a[b[x]];
            if(find(x) != find(y))
            {
                s[find(y)] += s[find(x)];
                p[x] = find(y);
            }
        }
        int cnt = 0, mx = 0;
        for(int i = 1; i <= n; i++)
        {
            if(s[i] > 1 && find(i) == i)
            {
                cnt ++;
                if(mx < s[i])mx = s[i];
            }
        }
        if(cnt == 0)mx = -1;
        System.out.println(cnt + " " + mx);
    }
    public static int find(int x)
    {
        if(p[x] != x)p[x] = find(p[x]);
        return p[x];
    }
}
全部评论

相关推荐

03-21 10:53
复旦大学 Java
大家好,我是@程序员花海,眼下&nbsp;26&nbsp;届春招、27&nbsp;届暑期实习全面开启,后端卷到没边,AI&nbsp;Agent的岗位占主导,很多牛友在我的评论区留言,想让我出一份Agent学习路线。我特意去看了下,打开淘天的招聘页面,以校招为例,一眼望去全是AI相关的岗位,只能说之后绝大多数岗位都会快速推进AI的落地和实践。之前写过&nbsp;Java&nbsp;后端&nbsp;3&nbsp;个月抢救路线https://www.nowcoder.com/discuss/824693499982315520?sourceSSR=users,也收到了牛友们的强烈好评,这次专门给后端转&nbsp;Agent做一套最少必要知识路线——&nbsp;不堆概念、不啃论文,只学面试必问、项目...
在职牛马didi:这篇路线整理得很系统,把后端知识映射到Agent体系这个思路特别实用。我自己也是从Java转做AI的,感触很深:工程底子扎实的人转Agent确实有优势,RAG和工具编排这些核心能力本质上都是后端逻辑的延伸。我们团队在做天猫的AI应用落地,方向跟你这篇路线里的企业级RAG和Agent系统很接近。暑期实习还在招AI应用研发工程师,JD可以参考看看跟你背景是否匹配:https://www.nowcoder.com/jobs/detail/440929?jobId=440929
软件开发投递记录
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务