Implementation
S_3_Common_Card_Choice.cpp
Wrap
Copy code
Full screen
C++
1 #include <bits/stdc++.h>
2 using namespace std;
3 using ll = long long ;
4 using i128 = __int128;
5 const int inf = 1e9 ;
6 const ll INF = 1LL << 60 ;
7 int main () {
8 ios:: sync_with_stdio (0 ); cin.tie (0 );
9 int n; cin >> n;
10 vector < ll> v (n);
11 for (int i = 0 ; i < n; i++ ) cin >> v[i];
12 if (v[0 ] == - 1 ) {
13 int k = min (100 , n / 4 );
14 cout << k << '\n' ;
15 int cur = 1 ;
16 for (int i = 0 ; i < k; i++ ) {
17 cout << 2 << " " << 2 << '\n' ;
18 cout << cur << " " << cur + 1 << '\n' ;
19 cout << cur + 2 << " " << cur + 3 << '\n' ;
20 cur + = 4 ;
21 }
22 return 0 ;
23 }
24 auto out = [& ](const vector < int > & a, const vector < int > & b) {
25 cout << "YES" << '\n' ;
26 cout << a.size () << " " << b.size () << '\n' ;
27 for (int i = 0 ; i < a.size (); i++ ) {
28 cout << a[i] << " \n" [i == a.size () - 1 ];
29 }
30 for (int i = 0 ; i < b.size (); i++ ) {
31 cout << b[i] << " \n" [i == b.size () - 1 ];
32 }
33 };
34 if (n < 5 ) {
35 ll lim = 1 ;
36 for (int i = 0 ; i < n; i++ ) lim * = 3 ;
37 for (int mask = 0 ; mask < lim; mask++ ) {
38 ll x = mask;
39 vector < int > a, b;
40 ll sum_a = 0 , sum_b = 0 ;
41 for (int i = 0 ; i < n; i++ ) {
42 int c = x % 3 ;
43 x / = 3 ;
44 if (c == 1 ) {
45 a.push_back (i + 1 );
46 sum_a + = v[i];
47 } else if (c == 2 ) {
48 b.push_back (i + 1 );
49 sum_b + = v[i];
50 }
51 }
52 if (a.size () == 0 || b.size () == 0 || a.size () == n || b.size () == n) continue ;
53 int g = gcd (sum_a, sum_b);
54 if (g > 1 ) {
55 out (a, b);
56 return 0 ;
57 }
58 }
59 cout << "NO" << '\n' ;
60 return 0 ;
61 }
62 vector < int > even_indx, odd_indx;
63 for (int i = 0 ; i < 5 ; i++ ) {
64 if ((v[i] & 1 ) == 0 ) even_indx.push_back (i + 1 );
65 else odd_indx.push_back (i + 1 );
66 }
67 if (even_indx.size () >= 4 ) {
68 vector < int > a = {even_indx[0 ], even_indx[1 ]}, b = {even_indx[2 ], even_indx[3 ]};
69 out (a, b);
70 return 0 ;
71 } else if (odd_indx.size () >= 4 ) {
72 vector < int > a = {odd_indx[0 ], odd_indx[1 ]}, b = {odd_indx[2 ], odd_indx[3 ]};
73 out (a, b);
74 return 0 ;
75 } else if (even_indx.size () == 3 && odd_indx.size () == 2 ) {
76 vector < int > a = {even_indx[0 ], even_indx[1 ]}, b = {odd_indx[0 ], odd_indx[1 ]};
77 out (a, b);
78 return 0 ;
79 } else if (even_indx.size () == 2 && odd_indx.size () == 3 ) {
80 vector < int > a = {odd_indx[0 ], odd_indx[1 ]}, b = {even_indx[0 ], even_indx[1 ]};
81 out (a, b);
82 return 0 ;
83 }
84 return 0 ;
85 }