博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kernel Knights (Gym - 101480K)
阅读量:5124 次
发布时间:2019-06-13

本文共 1218 字,大约阅读时间需要 4 分钟。

#include 
using namespace std;typedef long long ll;int a[200005]; //存放原始数据int vis[200005]; //标记选的对手int b[200005]; //答案序列queue
q; //把所有能够选的都存一次,接着遍历与它有关系的。int main(){ int n,x; scanf("%d",&n); memset(vis,0,sizeof(vis)); //初始化 memset(b,0,sizeof(b)); //memset(a,0,sizeof(a)); for(int i = 1; i <= 2*n; i ++) { scanf("%d",&a[i]); vis[a[i]]++; } for(int i = 1; i <= 2*n; i ++) // 把能够选的放入到队列中,遍历与它相连的是否可以选上 { if(vis[i] == 0) q.push(i); } while(!q.empty()) { int x = q.front(); q.pop(); b[x] = 1; // 表示可以选择放入到S中 if(b[a[x]]==-1) // 如果x被选上了,那么x所选的对手被处理过一次不能选,跳过就可以 continue; //因为不跳出,vis会再重复减一次,导致答案会增多或者减少一些 b[a[x]] = -1; vis[a[a[x]]] --; // x选的对手y,y选的对手要减1,因为x被选进S中,y现在就相当于x的位置,y的选的对手就可以放进S中 if(vis[a[a[x]]] == 0) //当vis[z = a[a[x]]]为0,说明没有人挑战z,所以z要放进S中 q.push(a[a[x]]); } for(int i=1; i<=2*n; i++) { if(i<=n&&b[i]>=0) // 在第一房间(排)中,只要符合不与下面的在一个集合中就可以选择 printf("%d ",i); else if(b[i]==1) printf("%d ",i); } printf("\n"); return 0;}

 

转载于:https://www.cnblogs.com/lcchy/p/10139505.html

你可能感兴趣的文章
[Docker]Docker拉取,上传镜像到Harbor仓库
查看>>
javascript 浏览器类型检测
查看>>
nginx 不带www到www域名的重定向
查看>>
记录:Android中StackOverflow的问题
查看>>
导航,头部,CSS基础
查看>>
[草稿]挂载新硬盘
查看>>
[USACO 2017 Feb Gold] Tutorial
查看>>
关于mysql中GROUP_CONCAT函数的使用
查看>>
OD使用教程20 - 调试篇20
查看>>
Java虚拟机(JVM)默认字符集详解
查看>>
Java Servlet 过滤器与 springmvc 拦截器的区别?
查看>>
(tmp >> 8) & 0xff;
查看>>
linux命令之ifconfig详细解释
查看>>
NAT地址转换
查看>>
Nhibernate 过长的字符串报错 dehydration property
查看>>
Deque - leetcode 【双端队列】
查看>>
Linux 普通用户拿到root权限及使用szrz命令上传下载文件
查看>>
人物角色群体攻击判定(一)
查看>>
JavaWeb学习过程 之c3p0的使用
查看>>
MySql Delimiter
查看>>