zoukankan      html  css  js  c++  java
  • Codeforces 1090D

    题目链接:https://codeforces.com/contest/1090/problem/D

    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".

    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.

    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.

    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.

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

    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).

    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.

    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".

    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.

    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
    ");return 0;}
    
        printf("YES
    ");
        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("
    ");
        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("
    ");
    }
  • 相关阅读:
    hdu6060[贪心+dfs] 2017多校3
    Codeforces 547B. Mike and Feet[单调栈/队列]
    Codeforces 545E. Paths and Trees[最短路+贪心]
    gitignore使用
    es学习
    google浏览器安装jsonview
    sychronized关键字底层详解加锁升级过程
    idea 中 “XXX has broken path” 错误解决
    kafka高并发读写的原因
    window redis版本 安装
  • 原文地址:https://www.cnblogs.com/dilthey/p/10092161.html
Copyright © 2011-2022 走看看