類似配列CodeForces-1090D(构造)

類似の配列

トピック:

トピックは2つのシーケンスを作成することです

Aシーケンスの各番号は異なり、Bシーケンスの2つの同一番号のみ

Mグループ関係iの場合、jはai> ajまたはai <ajを意味します

同時に、シーケンスBはシーケンスAと同じ関係にあります。ai> ajの場合、bi> bj

アイデア:

最初に、構成できない状況について考えます。Aシーケンスの数値のペアが関連している場合、Bシーケンスに2つの同一の数値を含めることはできません。

即m> =(n-1)* n / 2

m <(n-1)* n / 2の場合、2つの無関係な点を見つけ、シーケンスAにnとn-1を割り当て、シーケンスBにnとnを割り当て 

残りのAおよびBシーケンスは同じです。

  1 #include <cstdio>
   2 #include < string .h>
   3 #include <algorithm>
   4 #include <cmath>
   5 #include <iostream>
   6 #include <vector>
   7 #include <queue>
   8 #include < set >
   9 #include <map>
 10 #include <cctype>
 11  #define ios ios :: sync_with_stdio(false)、cin.tie(0)、cout.tie(0)
 12  #define mem(a、x)memset(a、 x、sizeof(a))
 13  #define lson rt << 1、l、mid
 14  #define rson rt << 1 | 1、
中央+ 1、r15  #define P pair <int、int>
 16  #define ull unsigned long long
 17  名前空間std を使用 ;
18 typedef long long ll;
19 const int maxn = 2e5 + 10 ;
20 const ll mod = 998244353 ;
21 const int inf = 0x3f3f3f3f ;
22 const long long INF = 0x3f3f3f3f3f3f3f3f ;
23 const double eps = 1e- 7 ;
           24  インラインll read()
 25  {
 26      ll X = 0、w = 0 ; char ch = 0 ;
27      while(!isdigit(ch)){w | = ch == ' - ' ; ch = getchar(); }
 28      while(isdigit(ch))X =(X << 3)+(X << 1)+(ch ^ 48)、ch = getchar();
29      リターン w?- X:X;
30  }
 31  ll n、m、a、b;
32 vector < int > vec [maxn]、v;
33  ll cnt [maxn]、arr1 [maxn]、arr2 [maxn]、cnt1 [maxn];
34  
35  
36  
37  int main()
 38  {
 39      n = read()、m = read();
40      forint i = 1 ; i <= m; ++ i)
 41      {
 42          int u = read()、v = read();
43          vec [u] .push_back(v);
44          vec [v] .push_back(u);
45      }
 46      if2 * m> = n *(n- 1 ))
 47      {
 48         cout << " NO " << endl;
49は         0を返し ます50      }
 51      int anspos;
52      forint i = 1 ; i <= n; ++ i)
 53      {
 54          if(vec [i] .size()== n- 1continue ;
55          else 
56          {
 57              anspos = i;
58              forint j = 0 ; j <vec [i] .size(); ++ j)cnt [vec [i] [j]] =1 ;
59              休憩;
60          }
 61      }
 62      forint i = 1 ; i <= n; ++ i)
 63      {
 64          if(cnt [i] == 0 && i!= anspos)
 65          {
 66              arr2 [anspos] = arr2 [i ] = n;
67              arr1 [anspos] = n、arr1 [i] = n- 1 ;
68              休憩;
69          }
 70      }
 71      int res = 0;
72      forint i = 1 ; i <= n; ++ i)
 73      {
 74          if(arr1 [i] == 0)arr1 [i] = ++ res;
75      }
 76      res = 0 ;
77      forint i = 1 ; i <= n; ++ i)
 78      {
 79          if(arr2 [i] == 0)arr2 [i] = ++ res;
80      }
 81      cout << " YES " << endl;
82      forint i = 1 ; i <= n; ++ i)
 83      {
 84          cout << arr1 [i];
85          if(i == n)cout << endl;
86          else cout << "  " ;
87      }
 88      forint i = 1 ; i <= n; ++ i)
 89      {
 90          cout << arr2 [i];
91          if(i == n)cout << endl;
92          cout << "  ";
93      }
 94  
95  }
 96  
97  
98  / * 
99  4 5
 100  11 12 13 14 15
 101  0 4 10 15 20
 102  2 10 30 32 40
 103  20 21 22 23 24
 104  * /
ACコード

 

おすすめ

転載: www.cnblogs.com/DreamACMer/p/12707644.html
おすすめ