舔狗
作者:互联网
链接:https://ac.nowcoder.com/acm/contest/903/J
来源:牛客网
空间限制: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^62≤n≤106
输出描述:
第一行一个数字,表示一无所有的舔狗的最小数量。示例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; }
标签:,10,朝思暮想,int,一无所有,maxn,配对 来源: https://www.cnblogs.com/czy-power/p/11266384.html