前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kernel Knights (Gym - 101480K)

Kernel Knights (Gym - 101480K)

作者头像
Lokinli
发布2023-03-09 16:52:50
1640
发布2023-03-09 16:52:50
举报
文章被收录于专栏:以终为始以终为始

题目链接

代码语言:javascript
复制
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
int a[200005];   //存放原始数据
int vis[200005]; //标记选的对手
int b[200005]; //答案序列
queue<int>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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档