NC26008. 舔狗
描述
输入描述
第一行一个 n,表示舔狗个数。
第二行 n 个数字,第 i 个数字表示第 i只舔狗的朝思暮想的一位的编号 。
输出描述
第一行一个数字,表示一无所有的舔狗的最小数量。
示例1
输入:
10 3 1 8 6 10 1 4 1 6 1
输出:
0
C++11(clang++ 3.9) 解法, 执行用时: 622ms, 内存消耗: 20060K, 提交时间: 2020-10-04 16:10:31
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; struct node{int x,p;}; bool operator < (node a,node b){return a.p>b.p;} priority_queue<node> q; int n,a[N],d[N],v[N]; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; d[a[i]]++; } for(int i=1;i<=n;i++) q.push({i,d[i]}); while(!q.empty()) { node k=q.top(); q.pop(); if(v[k.x]||v[a[k.x]]) continue; n-=2; v[k.x]=v[a[k.x]]=1; d[a[a[k.x]]]--; q.push({a[a[k.x]],d[a[a[k.x]]]}); } cout<<n<<endl; return 0; }