제출 #952257

#제출 시각아이디문제언어결과실행 시간메모리
952257ereonzisDrvca (COCI19_drvca)C++17
110 / 110
115 ms11844 KiB
//#pragma GCC optimize("O3") //#pragma GCC optimize("Ofast") //#pragma GCC optimize("unroll-loops") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #include <bits/stdc++.h> using namespace std; namespace debug { template <class c> struct rge { c b, e; }; template <class c> rge<c> range(c i, c j) { return rge<c>{i, j}; } template <class c> char spk(...); template <class c> auto spk(c *a) -> decltype(cerr << *a, 0); struct stream { ~stream() { cerr << endl; } template <class c> typename enable_if<sizeof spk<c>(0) != 1, stream &>::type operator<<(c i) { cerr << boolalpha << i; return *this; } template <class c> typename enable_if<sizeof spk<c>(0) == 1, stream &>::type operator<<(c i) { return *this << range(begin(i), end(i)); } template <class a, class b> stream &operator<<(pair<a, b> p) { return *this << "(" << p.first << ", " << p.second << ")"; } template <class c> stream &operator<<(rge<c> d) { *this << "["; for (auto it = d.b; it != d.e; it++) *this << ", " + 2 * (it == d.b) << *it; return *this << "]"; } stream &_dbg(const string &s, int i, int b) { return *this; } template <class c, class... cs> stream &_dbg(const string &s, int i, int b, c arg, cs... args) { if (i == (int)(s.size())) return (*this << ": " << arg); b += (s[i] == '(') + (s[i] == '[') + (s[i] == '{') - (s[i] == ')') - (s[i] == ']') - (s[i] == '}'); return (s[i] == ',' && b == 0) ? (*this << ": " << arg << " ")._dbg(s, i + 1, b, args...) : (s[i] == ' ' ? *this : *this << s[i]) ._dbg(s, i + 1, b, arg, args...); } }; } // namespace debug #ifdef DEBUG #define dout debug::stream() #define dbg(...) \ ((dout << "line:" << __LINE__ << " >> ") \ ._dbg(#__VA_ARGS__, 0, 0, __VA_ARGS__)) #else #define dout #define dbg(...) #endif // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void PrintAnswer(bool exists, const vector<int> &A, const vector<int> &B) { if (!exists) { cout << -1 << '\n'; exit(0); } cout << A.size() << '\n'; for (int x : A) { cout << x << " "; } cout << '\n'; cout << B.size() << '\n'; for (int x : B) { cout << x << " "; } cout << '\n'; exit(0); } pair<vector<int>, vector<int>> SplitWithArithmeticSequence(const vector<int> &v, int start, int diff) { vector<int> A, B; for (int i = 0; i < (int)v.size(); i++) { if (v[i] == start) { A.push_back(v[i]); start += diff; } else { B.push_back(v[i]); } } return {A, B}; } void AlignSequences(const vector<int> &A, vector<int> B) { multiset<int> elements(A.begin(), A.end()), diffs; for (int i = 1; i < (int)A.size(); i++) { diffs.insert(A[i] - A[i - 1]); } while (!B.empty() && *diffs.begin() != *diffs.rbegin()) { int b = B.back(); B.pop_back(); auto it = elements.insert(b); if (it != elements.begin() && next(it) != elements.end()) { diffs.erase(diffs.find(*next(it) - *prev(it))); } if (it != elements.begin()) { diffs.insert(*it - *prev(it)); } if (next(it) != elements.end()) { diffs.insert(*next(it) - *it); } } if (!B.empty()) { PrintAnswer(true, vector<int>(elements.begin(), elements.end()), B); } } int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); int n; cin >> n; vector<int> h(n); for (auto &x : h) cin >> x; sort(h.begin(), h.end()); if (n == 2) { PrintAnswer(true, {h[0]}, {h[1]}); } for (const auto &p : {make_pair(h[0], h[1] - h[0]), make_pair(h[0], h[2] - h[0]), make_pair(h[1], h[2] - h[1])}) { auto [A, B] = SplitWithArithmeticSequence(h, p.first, p.second); if (B.empty()) { PrintAnswer(true, vector<int>(A.begin(), prev(A.end())), {A.back()}); } AlignSequences(B, A); } PrintAnswer(false, {}, {}); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...