Codeforces 1090D - Similar Arrays - [思惟題][構造題][2018-2019 Russia Open High School Programming Contest

題目連接:https://codeforces.com/contest/1090/problem/Dc++

Vasya had an array of n integers, each element of the array was from 1 to n. He chose m pairs of different positions and wrote them down to a sheet of paper. Then Vasya compared the elements at these positions, and wrote down the results of the comparisons to another sheet of paper. For each pair he wrote either "greater", "less", or "equal".less

After several years, he has found the first sheet of paper, but he couldn't find the second one. Also he doesn't remember the array he had. In particular, he doesn't remember if the array had equal elements. He has told this sad story to his informatics teacher Dr Helen.this

She told him that it could be the case that even if Vasya finds his second sheet, he would still not be able to find out whether the array had two equal elements.spa

Now Vasya wants to find two arrays of integers, each of length n. All elements of the first array must be distinct, and there must be two equal elements in the second array. For each pair of positions Vasya wrote at the first sheet of paper, the result of the comparison must be the same for the corresponding elements of the first array, and the corresponding elements of the second array.code

Help Vasya find two such arrays of length n, or find out that there are no such arrays for his sets of pairs.orm

Input
The first line of input contains two integers n, m — the number of elements in the array and number of comparisons made by Vasya (1≤n≤100000, 0≤m≤100000).blog

Each of the following m lines contains two integers ai, bi — the positions of the i-th comparison (1≤ai,bi≤n; ai≠bi). It's guaranteed that any unordered pair is given in the input at most once.ci

Output
The first line of output must contain "YES" if there exist two arrays, such that the results of comparisons would be the same, and all numbers in the first one are distinct, and the second one contains two equal numbers. Otherwise it must contain "NO".element

If the arrays exist, the second line must contain the array of distinct integers, the third line must contain the array, that contains at least one pair of equal elements. Elements of the arrays must be integers from 1 to n.rem

Examples
input
1 0
output
NO
input
3 1
1 2
output
YES
1 3 2
1 3 1
input
4 3
1 2
1 3
2 4
output
YES
1 3 4 2
1 3 4 1

 

題意:

給定 $n,m$,給定 $m$ 個無序對 $(a,b)$ 表明位置 $a$ 上的數字和位置 $b$ 上的數字進行比較。且這 $m$ 個無序對無重複。

讓你尋找兩個序列,第一個序列由 $1 \sim n$ 組成,元素互不相同且惟一。第二個序列,要知足和第一個序列對於 $m$ 個比較的結果相同,且某一個數字要出現兩次,其他則皆屬於 $[1,n]$ 且互不相同且惟一。

 

題解:

能夠想見,若是有 $\frac{n(n-1)}{2}$ 次比較,那麼就能夠惟一肯定該序列,則要輸出 "NO" 。

一旦少那麼一次,就表明有兩個位置上的數字沒有比較,不妨令這兩個位置上的數字本來是最大和次大,如今全變成最大,這樣不會改變 $m$ 次比較的結果。

 

AC代碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=1e5+10;
int n,m;
pii p[maxn];
pii findpos()
{
    int a,b,c=0;
    pii res;
    for(a=1;a<=n;a++) for(b=a+1;b<=n;b++) if((res=make_pair(a,b))!=p[++c]) return res;
}
int main()
{
    cin>>n>>m;
    for(int i=1,a,b;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        p[i]=make_pair(min(a,b),max(a,b));
    }
    if((ll)n*(n-1)/2 <= (ll)m) {printf("NO\n");return 0;}

    printf("YES\n");
    sort(p+1,p+1+m);
    pii pos=findpos();
    for(int i=1,cnt=0;i<=n;i++)
    {
        if(i==pos.first) printf("%d ",n-1);
        else if(i==pos.second) printf("%d ",n);
        else printf("%d ",++cnt);
    }
    printf("\n");
    for(int i=1,cnt=0;i<=n;i++)
    {
        if(i==pos.first) printf("%d ",n);
        else if(i==pos.second) printf("%d ",n);
        else printf("%d ",++cnt);
    }
    printf("\n");
}
相關文章
相關標籤/搜索