Codeforces Round \ # 279 (Div. 2) B - Queue (단순 링크)

이 문 제 는 괜찮다.간단 한 사고 문제 다.근 데 자기가 무슨 일 인지 오 랜 만 에 알 아 봤 어.
한 대열 에 대하 여.모든 사람의 앞 사람과 뒤에 있 는 사람의 번 호 를 드 리 겠 습 니 다.원래 의 대열 을 제시 하 다.
이 문 제 는 간단 한 줄 알 았 는데머리 끝 만 찾 으 면 중간 에 바로 출력 하면 돼.그런데 WA 가 보 니 질서 가 있 었 는데...(반응 이 너무 느리다)
자신 이 샘플 을 하나 쓰 고 자신 이 먼저 대열 을 작성 하 다.예 를 들 면 6, 5, 8, 7, 4.  그렇게 주어진 입력 은 0, 5 입 니 다.      6 8       5 7        8  4       7 0
6, 8, 4 가 한 팀 이라는 걸 알 게 될 거 예요.  57 은 한 팀 이다.그럼 사실 문 제 는 이렇다.두 줄 의 숫자 입 니 다.매번 첫 번 째 체인 을 먼저 출력 하고 두 번 째 체인 을 출력 하면 이렇게 순환 출력 하면 됩 니 다.
그렇다면 문 제 는 머리 를 어떻게 찾 느 냐 하 는 것 이다.사실 머리 는 숫자 에 한 번 밖 에 나타 나 지 않 았 고 왼쪽 에는 숫자 가 없 었 다. 두 번 째 사슬 의 머리. 입력 할 때 반드시 0 X。
알 고 만 들 었 어.
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
#define MAXN 1000000+10
#define INF (1<<30)
#define mod 123456789
int vis[MAXN][2] = {0};
int l[MAXN];
int main (){
    int n;
    scanf("%d",&n);
    int a,b;
    int two1 = 0,two2 = 0;
    for(int i = 0; i < n; i++){
        scanf("%d %d",&a,&b);
        if(!a){
            two1 = b;
            vis[b][1] = 1; //1  
        }
        else if(!b){
            vis[a][0] = 1;
        }
        else{
            l[a] = b;
            vis[b][1] = 1; //1     b       
            vis[a][0] = 1;          a       
        }
    }
    int fro = 0, en = 0;
    for(int i = 0; i <= MAXN-10; i++){
        if(vis[i][0] && !vis[i][1])
            fro = i;
    }
    printf("%d",fro);
    printf(" %d",two1);
    for(int i = 1; i < n/2; i++){
        printf(" %d",l[fro]);
        printf(" %d",l[two1]);
        fro = l[fro];
        two1 = l[two1];
    }
    if(n %2 == 1)
        printf(" %d",l[fro]);
    printf("
"); return 0; }

좋은 웹페이지 즐겨찾기