舔狗

链接:https://ac.nowcoder.com/acm/contest/903/J
来源:牛客网

舔狗
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

> “舔狗舔狗,
> 舔到最后,
> 一无所有。”

有 n 只舔狗,每只舔狗的心中都有自己朝思暮想的一位。

每个人虽然受到了一万次拒绝,还毅然第一万零一次鼓起勇气。

作为一个不食人间烟火的算法设计师,你早已看破红尘。但是,人世间的苦难仍让你挂念。看到众生在单恋中苦苦坚持,你决定普度众生,给大家找到一个最好的结局,让一无所有的舔狗尽量地少,让每个人都尽量能和自己喜欢的或喜欢自己的人修成正果。

也就是说,你需要给这 n 只舔狗配对,对于舔狗 i,他可以和他朝思暮想的人 aia_{i}ai 配对。另外,喜欢 i 的其他舔狗也可以和他配对。你需要让没有被配对的舔狗尽量少。

输入描述:

第一行一个 n,表示舔狗个数。
第二行 n 个数字,第 i 个数字表示第 i只舔狗的朝思暮想的一位的编号 aia_{i}ai
2≤n≤1062\le n \le 10^62n106

输出描述:

第一行一个数字,表示一无所有的舔狗的最小数量。
示例1

输入

复制
10
3 1 8 6 10 1 4 1 6 1

输出

复制
0
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e6+10;
struct node{
    int pos,val;
    bool operator<(const node &cur)const {
        return val>cur.val;
    }
};
priority_queue<node>q;
int n;
int vis[maxn];
int w[maxn],e[maxn];
int main()
{
    scanf("%d",&n);
    for(register int i=1;i<=n;++i){
        scanf("%d",w+i);
        e[w[i]]++;
    }
    for(register int i=1;i<=n;++i){
        q.push(node{i,e[i]});
    }
    while (!q.empty()){
        node cur=q.top();
        q.pop();
        int now=cur.pos;
        int nx=w[now];
        if(vis[now]||vis[nx])continue;
        vis[now]=vis[nx]=1;
        n-=2;
        e[w[nx]]--;
        q.push(node{w[nx],e[w[nx]]});
    }
    printf("%d\n",n);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/czy-power/p/11266384.html