Submission #254545

#TimeUsernameProblemLanguageResultExecution timeMemory
254545MrRobot_28Drvca (COCI19_drvca)C++17
110 / 110
101 ms4208 KiB
#include <bits/stdc++.h> using namespace std; #define int long long int n; vector <bool> used; vector <int> a; int lower(int l, int r, int val) { l--; int l1 = l; r++; int r1 = r; while(r - l > 1) { int midd = (r + l) / 2; if(a[midd] < val || a[midd] == val && used[midd]) { l = midd; } else { r = midd; } } if(r1 != r && a[r] == val) { return r; } if(l != l1 && a[l] == val) { return l; } return r; } void funct1() { int diff = a[1] - a[0]; vector <int> vec1; used[0] = 1; vec1.push_back(a[0]); int it1 = 1; for(int j = 1; j < n; j++) { if(it1 == n) { break; } int it = lower(it1, n - 1, vec1.back() + diff); if(it != a.size() && a[it] == vec1.back() + diff) { vec1.push_back(a[it]); used[it] = 1; it1 = it + 1; } else { break; } } vector <int> vec2; for(int j = 0; j < n; j++) { if(!used[j]) { vec2.push_back(a[j]); } } bool flag = true; for(int j = 1; j + 1 < vec2.size(); j++) { if(vec2[j] - vec2[j - 1] != vec2[j + 1] - vec2[j]) { flag = false; } } if(flag && vec2.size() > 0) { cout << vec1.size() << "\n"; for(int i = 0; i < vec1.size(); i++) { cout << vec1[i] << " "; } cout << "\n"; cout << vec2.size() << "\n"; for(int i = 0; i < vec2.size(); i++) { cout << vec2[i] << " "; } exit(0); } for(int i = n - 1; i >= 0; i--) { if(used[i]) { used[i] = 0; break; } } vec1.pop_back(); if(vec1.size() == 0) { return; } vec2.clear(); for(int i = 0; i < n; i++) { if(!used[i]) { vec2.push_back(a[i]); } } flag = true; for(int j = 1; j + 1 < vec2.size(); j++) { if(vec2[j] - vec2[j - 1] != vec2[j + 1] - vec2[j]) { flag = false; } } if(flag) { cout << vec1.size() << "\n"; for(int i = 0; i < vec1.size(); i++) { cout << vec1[i] << " "; } cout << "\n"; cout << vec2.size() << "\n"; for(int i = 0; i < vec2.size(); i++) { cout << vec2[i] << " "; } exit(0); } if(vec1.size() == 1) { return; } vec1.pop_back(); vec2.clear(); for(int i = n - 1; i >= 0; i--) { if(used[i]) { used[i] = 0; break; } } diff = a[n - 1] - a[n - 2]; vec2.push_back(a[n - 1]); it1 = n - 1; while(vec1.size() + vec2.size() < n) { int j = lower(0, it1 - 1, vec2.back() - diff); if(j == it1 || a[j] != vec2.back() - diff) { break; } if(used[j]) { if(vec1.back() != a[j]) { break; } vec1.pop_back(); } it1 = j; vec2.push_back(a[j]); } sort(vec2.begin(), vec2.end()); if(vec1.size() + vec2.size() == n && vec1.size() != 0) { cout << vec1.size() << "\n"; for(int i = 0; i < vec1.size(); i++) { cout << vec1[i] << " "; } cout << "\n"; cout << vec2.size() << "\n"; for(int i = 0; i < vec2.size(); i++) { cout << vec2[i] << " "; } exit(0); } } void funct2() { if(n < 3) { return; } int diff = a[2] - a[0]; vector <int> vec1; used[0] = 1; vec1.push_back(a[0]); int it1 = 1; for(int j = 1; j < n; j++) { if(it1 == n) { break; } int it = lower(it1, a.size() - 1, vec1.back() + diff); if(it != a.size() && a[it] == vec1.back() + diff) { vec1.push_back(a[it]); used[it] = 1; it1 = it + 1; } else { break; } } vector <int> vec2; for(int i = 0; i < n; i++) { if(!used[i]) { vec2.push_back(a[i]); } } bool flag = true; for(int j = 1; j + 1 < vec2.size(); j++) { if(vec2[j] - vec2[j - 1] != vec2[j + 1] - vec2[j]) { flag = false; } } if(flag && vec2.size() > 0) { cout << vec1.size() << "\n"; for(int i = 0; i < vec1.size(); i++) { cout << vec1[i] << " "; } cout << "\n"; cout << vec2.size() << "\n"; for(int i = 0; i < vec2.size(); i++) { cout << vec2[i] << " "; } exit(0); } for(int i = n - 1; i >= 0; i--) { if(used[i]) { used[i] = 0; break; } } vec1.pop_back(); if(vec1.size() == 0) { return; } vec2.clear(); for(int i = 0; i < n; i++) { if(!used[i]) { vec2.push_back(a[i]); } } flag = true; for(int j = 1; j + 1 < vec2.size(); j++) { if(vec2[j] - vec2[j - 1] != vec2[j + 1] - vec2[j]) { flag = false; } } if(flag) { cout << vec1.size() << "\n"; for(int i = 0; i < vec1.size(); i++) { cout << vec1[i] << " "; } cout << "\n"; cout << vec2.size() << "\n"; for(int i = 0; i < vec2.size(); i++) { cout << vec2[i] << " "; } exit(0); } if(vec1.size() == 1) { return; } vec1.pop_back(); vec2.clear(); for(int i = n - 1; i >= 0; i--) { if(used[i]) { used[i] = 0; break; } } diff = a[n - 1] - a[n - 2]; vec2.push_back(a[n - 1]); it1 = n - 1; while(vec1.size() + vec2.size() < n) { int j = lower(0, it1 - 1, vec2.back() - diff); if(j == it1 || a[j] != vec2.back() - diff) { break; } if(used[j]) { if(vec1.back() != a[j]) { break; } vec1.pop_back(); } it1 = j; vec2.push_back(a[j]); } sort(vec2.begin(), vec2.end()); if(vec1.size() + vec2.size() == n && vec1.size() != 0) { cout << vec1.size() << "\n"; for(int i = 0; i < vec1.size(); i++) { cout << vec1[i] << " "; } cout << "\n"; cout << vec2.size() << "\n"; for(int i = 0; i < vec2.size(); i++) { cout << vec2[i] << " "; } exit(0); } } void funct3() { if(n < 3) { return; } int diff = a[2] - a[1]; vector <int> vec1; used[0] = 1; vec1.push_back(a[1]); int it1 = 2; for(int j = 1; j < n; j++) { if(it1 == n) { break; } int it = lower(it1, a.size() - 1, vec1.back() + diff); if(it != a.size() && a[it] == vec1.back() + diff) { vec1.push_back(a[it]); used[it] = 1; it1 = it + 1; } else { return; } } vector <int> vec2; for(int j = 0; j < n; j++) { if(!used[j]) { vec2.push_back(a[j]); } } bool flag = true; for(int j = 1; j + 1 < vec2.size(); j++) { if(vec2[j] - vec2[j - 1] != vec2[j + 1] - vec2[j]) { flag = false; } } if(flag && vec2.size() > 0) { cout << vec1.size() << "\n"; for(int i = 0; i < vec1.size(); i++) { cout << vec1[i] << " "; } cout << "\n"; cout << vec2.size() << "\n"; for(int i = 0; i < vec2.size(); i++) { cout << vec2[i] << " "; } exit(0); } for(int i = n - 1; i >= 0; i--) { if(used[i]) { used[i] = 0; break; } } vec1.pop_back(); if(vec1.size() == 0) { return; } vec2.clear(); for(int i = 0; i < n; i++) { if(!used[i]) { vec2.push_back(a[i]); } } flag = true; for(int j = 1; j + 1 < vec2.size(); j++) { if(vec2[j] - vec2[j - 1] != vec2[j + 1] - vec2[j]) { flag = false; } } if(flag) { cout << vec1.size() << "\n"; for(int i = 0; i < vec1.size(); i++) { cout << vec1[i] << " "; } cout << "\n"; cout << vec2.size() << "\n"; for(int i = 0; i < vec2.size(); i++) { cout << vec2[i] << " "; } exit(0); } if(vec1.size() == 1) { return; } vec1.pop_back(); vec2.clear(); for(int i = n - 1; i >= 0; i--) { if(used[i]) { used[i] = 0; break; } } diff = a[n - 1] - a[n - 2]; vec2.push_back(a[n - 1]); it1 = n - 1; while(vec1.size() + vec2.size() < n) { int j = lower(0, it1 - 1, vec2.back() - diff); if(j == it1 || a[j] != vec2.back() - diff) { break; } if(used[j]) { if(vec1.back() != a[j]) { break; } vec1.pop_back(); } it1 = j; vec2.push_back(a[j]); } sort(vec2.begin(), vec2.end()); if(vec1.size() + vec2.size() == n && vec1.size() != 0) { cout << vec1.size() << "\n"; for(int i = 0; i < vec1.size(); i++) { cout << vec1[i] << " "; } cout << "\n"; cout << vec2.size() << "\n"; for(int i = 0; i < vec2.size(); i++) { cout << vec2[i] << " "; } exit(0); } } signed main(){ // ios_base::sync_with_stdio(false); // cin.tie(NULL); // cout.tie(NULL); cin >> n; a.resize(n); used.resize(n); for(int i = 0; i < n; i++) { cin >> a[i]; } sort(a.begin(), a.end()); funct1(); for(int i = 0; i < n; i++) { used[i] = 0; } funct2(); for(int i = 0; i < n; i++) { used[i] = 0; } funct3(); cout << -1; return 0; }

Compilation message (stderr)

drvca.cpp: In function 'long long int lower(long long int, long long int, long long int)':
drvca.cpp:17:38: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if(a[midd] < val || a[midd] == val && used[midd])
drvca.cpp: In function 'void funct1()':
drvca.cpp:50:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(it != a.size() && a[it] == vec1.back() + diff)
      ~~~^~~~~~~~~~~
drvca.cpp:70:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int j = 1; j + 1 < vec2.size(); j++)
                 ~~~~~~^~~~~~~~~~~~~
drvca.cpp:80:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec1.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:86:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec2.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:114:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int j = 1; j + 1 < vec2.size(); j++)
                 ~~~~~~^~~~~~~~~~~~~
drvca.cpp:124:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec1.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:130:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec2.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:153:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while(vec1.size() + vec2.size() < n)
        ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
drvca.cpp:172:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(vec1.size() + vec2.size() == n && vec1.size() != 0)
     ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
drvca.cpp:175:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec1.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:181:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec2.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp: In function 'void funct2()':
drvca.cpp:206:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(it != a.size() && a[it] == vec1.back() + diff)
      ~~~^~~~~~~~~~~
drvca.cpp:226:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int j = 1; j + 1 < vec2.size(); j++)
                 ~~~~~~^~~~~~~~~~~~~
drvca.cpp:236:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec1.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:242:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec2.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:270:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int j = 1; j + 1 < vec2.size(); j++)
                 ~~~~~~^~~~~~~~~~~~~
drvca.cpp:280:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec1.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:286:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec2.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:309:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while(vec1.size() + vec2.size() < n)
        ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
drvca.cpp:328:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(vec1.size() + vec2.size() == n && vec1.size() != 0)
     ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
drvca.cpp:331:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec1.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:337:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec2.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp: In function 'void funct3()':
drvca.cpp:362:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(it != a.size() && a[it] == vec1.back() + diff)
      ~~~^~~~~~~~~~~
drvca.cpp:382:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int j = 1; j + 1 < vec2.size(); j++)
                 ~~~~~~^~~~~~~~~~~~~
drvca.cpp:392:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec1.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:398:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec2.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:426:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int j = 1; j + 1 < vec2.size(); j++)
                 ~~~~~~^~~~~~~~~~~~~
drvca.cpp:436:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec1.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:442:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec2.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:465:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while(vec1.size() + vec2.size() < n)
        ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
drvca.cpp:484:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(vec1.size() + vec2.size() == n && vec1.size() != 0)
     ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
drvca.cpp:487:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec1.size(); i++)
                  ~~^~~~~~~~~~~~~
drvca.cpp:493:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < vec2.size(); i++)
                  ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...