Task: | Järjestys |
Sender: | jlaire |
Submission time: | 2025-09-07 02:01:43 +0300 |
Language: | C++ (C++17) |
Status: | READY |
Result: | 10 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 10 |
#2 | TIME LIMIT EXCEEDED | 0 |
#3 | WRONG ANSWER | 0 |
#4 | WRONG ANSWER | 0 |
#5 | WRONG ANSWER | 0 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | ACCEPTED | 0.00 s | 1, 4, 5 | details |
#2 | ACCEPTED | 0.00 s | 1, 4, 5 | details |
#3 | ACCEPTED | 0.01 s | 1, 4, 5 | details |
#4 | ACCEPTED | 0.01 s | 1, 4, 5 | details |
#5 | ACCEPTED | 0.01 s | 1, 4, 5 | details |
#6 | ACCEPTED | 0.01 s | 1, 2, 4, 5 | details |
#7 | ACCEPTED | 0.01 s | 1, 3, 4, 5 | details |
#8 | ACCEPTED | 0.01 s | 1, 4, 5 | details |
#9 | ACCEPTED | 0.38 s | 2, 4, 5 | details |
#10 | WRONG ANSWER | 0.48 s | 3, 4, 5 | details |
#11 | ACCEPTED | 0.02 s | 4, 5 | details |
#12 | WRONG ANSWER | 0.27 s | 4, 5 | details |
#13 | WRONG ANSWER | 0.71 s | 4, 5 | details |
#14 | WRONG ANSWER | 0.71 s | 4, 5 | details |
#15 | TIME LIMIT EXCEEDED | -- | 2, 5 | details |
#16 | TIME LIMIT EXCEEDED | -- | 3, 5 | details |
#17 | ACCEPTED | 0.10 s | 5 | details |
#18 | TIME LIMIT EXCEEDED | -- | 5 | details |
#19 | TIME LIMIT EXCEEDED | -- | 5 | details |
#20 | TIME LIMIT EXCEEDED | -- | 5 | details |
#21 | TIME LIMIT EXCEEDED | -- | 5 | details |
#22 | TIME LIMIT EXCEEDED | -- | 5 | details |
Compiler report
input/code.cpp: In function 'ANS solve(const Viii&)': input/code.cpp:347:57: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare] 347 | if (R_OCC[R].size() == 1 && L_OCC[R].size() == nnn) { | ~~~~~~~~~~~~~~~~^~~~~~ input/code.cpp:460:25: warning: comparison of integer expressions of different signedness: 'std::multiset<std::tuple<int, int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare] 460 | if (NOPS.size() == oldsz) return {}; | ~~~~~~~~~~~~^~~~~~~~
Code
#include <bits/stdc++.h> using namespace std; using ll = long long; using ii = pair<int,int>; using iii = tuple<int,int,int>; using Viii = vector<iii>; using ANS = optional<Viii>; #define LEFT get<0> #define RIGHT get<1> #define ID get<2> #define FAKE_ID_BEGIN (-1) #define FAKE_ID_END (-2) #define RL(x) ii((x).second, (x).first) struct TEST { Viii V; multiset<iii> nops; Viii X; }; Viii compressL(const Viii& V) { set<int> RR; for (auto [L,R,id] : V) { RR.insert(R); } map<int,int> newL; { int misses = 0; for (auto [L,R_,id_] : V) { auto it = RR.lower_bound(L); if (it==RR.end() || (*it>L && it==RR.begin())) { if (misses++) return {}; newL[L] = 0; continue; } if (*it > L) --it; assert(*it <= L); newL[L] = *it; } } Viii X; for (auto [L,R,id] : V) { X.emplace_back(newL[L], R, id); } return X; } Viii compressR(const Viii& V) { set<int> LL; for (auto [L,R,id] : V) { LL.insert(L); } map<int,int> newR; { int misses = 0; for (auto [L_,R,id_] : V) { auto it = LL.lower_bound(R); if (it==LL.end()) { if (misses++) return {}; newR[R] = 1e9+1; continue; } assert(*it >= R); newR[R] = *it; } } Viii X; for (auto [L,R,id] : V) { X.emplace_back(L, newR[R], id); } return X; } Viii remove_nops(TEST& T, const Viii& V) { Viii X; for (auto [L,R,id] : V) { if (id >= 0 && L == R) { T.nops.insert(V[id]); continue; } X.emplace_back(L, R, id); } return X; } Viii compress_coord(const Viii& V) { set<int> S; for (auto [L,R,id] : V) { S.insert(L); S.insert(R); } map<int,int> M; int next = 0; for (int x : S) M[x] = next++; Viii X; for (auto [L,R,id] : V) { X.emplace_back(M[L], M[R], id); } return X; } bool compress(TEST& T) { Viii V2 = compressL(T.V); if (V2.empty()) return false; Viii V3 = compressR(V2); if (V3.empty()) return false; Viii V4 = remove_nops(T, V3); Viii V5 = compress_coord(V4); Viii V6 = compressL(V5); Viii V7 = compressR(V6); T.X = move(V7); return true; } TEST preprocess(const Viii& V0) { TEST T; Viii& V = T.V; V = V0; V.emplace_back(0, 0, FAKE_ID_BEGIN); V.emplace_back(1e9+1, 1e9+1, FAKE_ID_END); if (!compress(T)) { T.V.clear(); } return T; } ANS postprocess(TEST& T, const ANS& ans) { if (!ans) return {}; Viii res; assert(ID(*ans->begin()) == FAKE_ID_BEGIN); assert(ID(*ans->rbegin()) == FAKE_ID_END); const Viii& V = T.V; multiset<iii> &nops = T.nops; for (int i=1; i<(int)ans->size(); i++) { int prev_id = ID((*ans)[i-1]); int id = ID((*ans)[i]); int PREV = prev_id == FAKE_ID_BEGIN ? 0 : RIGHT(V[prev_id]); int NEXT = id == FAKE_ID_END ? 1e9 : LEFT(V[id]); for (auto it = nops.begin(); it != nops.end();) { int L = LEFT(*it); int R = RIGHT(*it); if (L >= PREV && R <= NEXT) { res.push_back(T.V[ID(*it)]); PREV = RIGHT(*it); it = nops.erase(it); } else { it++; } } if (id >= 0) res.push_back(V[id]); } if (!nops.empty()) return {}; return res; } bool ok(const multiset<int>& LS, const multiset<int>& RS) { set<int> S; for (int x:LS) S.insert(x); for (int x:RS) S.insert(x); int L_below = 0; int R_below = 0; auto Lit = LS.begin(); auto Rit = RS.begin(); for (int x : S) { for (; Lit != LS.end() && *Lit <= x; Lit++, L_below++); for (; Rit != RS.end() && *Rit <= x; Rit++, R_below++); if (L_below > R_below) return false; int L_above = LS.size() - L_below; int R_above = RS.size() - R_below; if (R_above > L_above) return false; } return true; } ANS solve(const Viii& V) { if (V.empty()) return {}; map<int,iii> VM; for (auto x : V) VM[ID(x)] = x; int n = V.size(); map<int,int> Lid, Rid; map<ii,set<ii>> Ladj, Radj; map<int,int> Lmost, Rmost; map<ii,int> ALIVE; map<ii,vector<int>> BACKLOG; multiset<iii> NOPS; map<int,set<int>> L_OCC, R_OCC; auto hasL = [&](int id) { return Lid.count(id); }; auto hasR = [&](int id) { return Rid.count(id); }; std::function<int(int)> get_Lmost; get_Lmost = [&](int id) { if (!hasL(id)) return id; if (!Lmost.count(id)) Lmost[id] = Lid[id]; return Lmost[id] = get_Lmost(Lmost[id]); }; std::function<int(int)> get_Rmost; get_Rmost = [&](int id) { if (!hasR(id)) return id; if (!Rmost.count(id)) Rmost[id] = Rid[id]; return Rmost[id] = get_Rmost(Rmost[id]); }; auto kill = [&](int L, int R) { ii LR(L,R); int id = ALIVE[LR]; R_OCC[R].erase(id); L_OCC[L].erase(id); if (!BACKLOG.count(LR)) { ALIVE.erase(LR); Ladj.erase(LR); Radj.erase(LR); for (auto& p : Ladj) p.second.erase(RL(LR)); for (auto& p : Radj) p.second.erase(LR); } else { assert(!BACKLOG[LR].empty()); int id2 = BACKLOG[LR].back(); BACKLOG[LR].pop_back(); ALIVE[LR] = id2; if (BACKLOG[LR].empty()) { BACKLOG.erase(LR); } } }; auto is_fixed_begin = [&](int id) { return get_Lmost(id) == FAKE_ID_BEGIN; }; auto is_fixed_end = [&](int id) { return get_Rmost(id) == FAKE_ID_END; }; int TODO = n - 1; auto spawn = [&](int L, int R, int id) { if (L == R && id>=0) { id = get_Lmost(id); NOPS.emplace(L,R,id); TODO--; return; } if (!is_fixed_begin(id)) L_OCC[L].insert(id); if (!is_fixed_end(id)) R_OCC[R].insert(id); ii LR(L,R); if (ALIVE.count(LR)) { BACKLOG[LR].push_back(id); return; } for (auto [LR2,id2] : ALIVE) { auto [L2,R2] = LR2; if (L >= R2) { Ladj[LR].insert(RL(LR2)); Radj[LR2].insert(LR); } if (L2 >= R) { Ladj[LR2].insert(RL(LR)); Radj[LR].insert(LR2); } } ALIVE[LR] = id; }; for (auto [L,R,id] : V) spawn(L,R,id); auto getLR = [&](int id) { int L = get_Lmost(id); int R = get_Rmost(id); return ii(LEFT(VM[L]), RIGHT(VM[R])); }; auto join = [&](int L, int R) { TODO--; L = get_Rmost(L); R = get_Lmost(R); ii Lii = getLR(L); ii Rii = getLR(R); R_OCC[Lii.second].erase(L); L_OCC[Rii.first].erase(R); assert(Ladj[Rii].count(RL(Lii))); assert(Radj[Lii].count(Rii)); assert(!Lid.count(R)); assert(!Rid.count(L)); Rid[L] = R; Lid[R] = L; Rmost[L] = get_Rmost(R); Lmost[R] = get_Lmost(L); kill(Lii.first, Lii.second); kill(Rii.first, Rii.second); spawn(Lii.first, Rii.second, L); if (is_fixed_begin(L) && TODO>1) { ii newLR(Lii.first, Rii.second); for (ii LR2 : set<ii>(Radj[newLR])) { if (is_fixed_end(ALIVE[LR2])) { Radj[newLR].erase(LR2); Ladj[LR2].erase(RL(newLR)); } } } if (is_fixed_end(R) && TODO>1) { ii newLR(Lii.first, Rii.second); for (ii RL2 : set<ii>(Ladj[newLR])) { if (is_fixed_begin(ALIVE[RL(RL2)])) { Ladj[newLR].erase(RL2); Radj[RL(RL2)].erase(newLR); } } } }; while (TODO > 0) { if (Ladj.empty()) return {}; if (Radj.empty()) return {}; if (TODO == 1) { assert(ALIVE.size() == 2); for (auto [LR,id] : ALIVE) { for (auto [LR2,id2] : ALIVE) if (id != id2) { if (LR.second <= LR2.first) { Ladj[LR2].insert(RL(LR)); Radj[LR].insert(LR2); join(id, id2); goto next; } } } } for (const auto& [LR,S] : Ladj) { if (is_fixed_begin(ALIVE[LR])) continue; if (S.empty()) return {}; if (S.size() == 1) { ii LR2 = RL(*S.begin()); join(ALIVE[LR2], ALIVE[LR]); goto next; } } for (const auto& [LR,S] : Radj) { if (is_fixed_end(ALIVE[LR])) continue; if (S.empty()) return {}; if (S.size() == 1) { ii LR2 = *S.begin(); join(ALIVE[LR], ALIVE[LR2]); goto next; } } for (auto [LR,id] : ALIVE) { auto [L,R] = LR; int nnn = 1 + (L==R); if (R_OCC[R].size() == 1 && L_OCC[R].size() == nnn) { const auto& S = Radj[LR]; join(id, ALIVE[*S.begin()]); goto next; } } if (0) { map<int,int> L_OCC, R_OCC; for (auto [LR,id] : ALIVE) { auto [L,R] = LR; if (!is_fixed_begin(id)) L_OCC[L]++; if (!is_fixed_end(id)) R_OCC[R]++; } for (auto [LR,id] : ALIVE) { auto [L,R] = LR; int nnn = 1 + (L==R); if (R_OCC[R] == 1 && L_OCC[R] == nnn) { const auto& S = Radj[LR]; join(id, ALIVE[*S.begin()]); goto next; } } } if (0) { multiset<int> LS, RS; for (auto [L,R,id] : V) { if (id != FAKE_ID_BEGIN && !hasL(id)) LS.insert(L); if (id != FAKE_ID_END && !hasR(id)) RS.insert(R); } for (auto [LR,id] : ALIVE) { if (is_fixed_begin(id)) continue; if (is_fixed_end(id)) continue; int first = RIGHT(getLR(FAKE_ID_BEGIN)); auto [L,R] = LR; if (L < first) continue; LS.erase(LS.find(L)); RS.erase(RS.find(first)); if (!ok(LS,RS)) { LS.insert(L); RS.insert(first); continue; } join(FAKE_ID_BEGIN, id); goto next; } } //return {}; for (const auto& [LR,S] : Ladj) { if (is_fixed_begin(ALIVE[LR])) continue; assert(S.size() >= 2); auto it = S.rbegin(); auto it2 = next(it); if (it->first != it2->first) { join(ALIVE[RL(*it)], ALIVE[LR]); goto next; } } for (const auto& [LR,S] : Radj) { if (is_fixed_end(ALIVE[LR])) continue; assert(S.size() >= 2); auto it = S.begin(); auto it2 = next(it); if (it->first != it2->first) { join(ALIVE[LR], ALIVE[*it]); goto next; } } for (const auto& [LR,S] : Radj) { if (is_fixed_end(ALIVE[LR])) continue; assert(S.size() >= 2); auto it = S.begin(); if (it->first == LR.second) { join(ALIVE[LR], ALIVE[*it]); goto next; } } return {}; next:; } Viii ans; for (int id = FAKE_ID_BEGIN;; id = Rid[id]) { ans.push_back(VM[id]); if (id == FAKE_ID_END) break; } while (!NOPS.empty()) { int oldsz = NOPS.size(); Viii res; res.push_back(ans[0]); for (int i=1; i<(int)ans.size(); i++) { int prev_id = ID(ans[i-1]); int id = ID(ans[i]); int PREV = prev_id == FAKE_ID_BEGIN ? 0 : RIGHT(VM[prev_id]); int NEXT = id == FAKE_ID_END ? 1e9 : LEFT(VM[id]); for (auto it = NOPS.begin(); it != NOPS.end();) { int L = LEFT(*it); int R = RIGHT(*it); if (L >= PREV && R <= NEXT) { int xx = ID(*it); for (;;) { res.push_back(VM[xx]); if (!Rid.count(xx)) break; xx = Rid[xx]; } it = NOPS.erase(it); } else { it++; } } res.push_back(VM[id]); } swap(ans, res); if (NOPS.size() == oldsz) return {}; } return ans; } ANS solve2(const Viii& V) { TEST T = preprocess(V); auto ans = solve(T.X); if (ans) { return postprocess(T, *ans); } return {}; } int main() { cin.tie(0)->sync_with_stdio(0); int t; cin>>t; while (t--) { int n; cin>>n; set<iii> S; vector<iii> V; for (int i=0; i<n; i++) { int x,y; cin>>x>>y; S.emplace(x,y,i); V.emplace_back(x,y,i); } if (n==1) { cout << "YES\n"; cout << LEFT(V[0]) << ' ' << RIGHT(V[0]) << '\n'; continue; } if (ANS ans = solve2(V)) { cout << "YES\n"; for (auto [x,y,_] : *ans) { cout << x << ' ' << y << '\n'; } } else cout << "NO\n"; } }
Test details
Test 1
Group: 1, 4, 5
Verdict: ACCEPTED
input |
---|
100 1 74 75 1 100 43 ... |
correct output |
---|
YES 74 75 YES 100 43 YES ... |
user output |
---|
YES 74 75 YES 100 43 YES ... Truncated |
Test 2
Group: 1, 4, 5
Verdict: ACCEPTED
input |
---|
100 2 80 54 51 61 2 ... |
correct output |
---|
YES 51 61 80 54 YES 2 64 ... |
user output |
---|
YES 51 61 80 54 YES 2 64 ... Truncated |
Test 3
Group: 1, 4, 5
Verdict: ACCEPTED
input |
---|
100 3 3 74 91 45 100 24 ... |
correct output |
---|
YES 3 74 100 24 91 45 YES ... |
user output |
---|
YES 3 74 91 45 100 24 YES ... Truncated |
Test 4
Group: 1, 4, 5
Verdict: ACCEPTED
input |
---|
100 4 88 50 62 41 12 86 ... |
correct output |
---|
YES 12 86 88 50 62 41 66 93 ... |
user output |
---|
YES 12 86 88 50 62 41 66 93 ... Truncated |
Test 5
Group: 1, 4, 5
Verdict: ACCEPTED
input |
---|
100 5 82 80 80 92 5 22 ... |
correct output |
---|
YES 5 22 94 13 82 80 80 92 ... |
user output |
---|
YES 5 22 82 80 80 92 93 91 ... Truncated |
Test 6
Group: 1, 2, 4, 5
Verdict: ACCEPTED
input |
---|
100 5 34 38 26 30 1 6 ... |
correct output |
---|
YES 1 6 12 22 26 30 34 38 ... |
user output |
---|
YES 1 6 12 22 26 30 34 38 ... Truncated |
Test 7
Group: 1, 3, 4, 5
Verdict: ACCEPTED
input |
---|
100 5 50 40 28 25 51 7 ... |
correct output |
---|
YES 51 7 50 40 47 1 17 11 ... |
user output |
---|
YES 17 11 28 25 50 40 51 7 ... Truncated |
Test 8
Group: 1, 4, 5
Verdict: ACCEPTED
input |
---|
100 5 2 2 2 1 1 1 ... |
correct output |
---|
YES 1 2 2 1 2 1 1 1 ... |
user output |
---|
YES 1 1 2 2 2 1 1 2 ... Truncated |
Test 9
Group: 2, 4, 5
Verdict: ACCEPTED
input |
---|
100 100 175870020 296379324 248160539 883842002 21934885 781732852 ... |
correct output |
---|
NO YES 4976156 6890135 10553287 11923223 14617057 17728163 ... |
user output |
---|
NO YES 4976156 6890135 10553287 11923223 14617057 17728163 ... Truncated |
Test 10
Group: 3, 4, 5
Verdict: WRONG ANSWER
input |
---|
100 100 447597377 314433951 700232436 691277009 937268439 708165426 ... |
correct output |
---|
YES 998963839 391778929 995772196 257222033 995754704 553123757 994629465 247775824 ... |
user output |
---|
NO NO NO NO NO ... Truncated |
Test 11
Group: 4, 5
Verdict: ACCEPTED
input |
---|
100 100 1 1 1 2 2 1 ... |
correct output |
---|
YES 1 2 2 1 1 2 2 2 ... |
user output |
---|
YES 1 1 1 1 1 1 1 1 ... Truncated |
Test 12
Group: 4, 5
Verdict: WRONG ANSWER
input |
---|
100 100 7 1 6 3 10 9 ... |
correct output |
---|
YES 6 7 7 8 9 10 10 10 ... |
user output |
---|
YES 1 9 9 9 9 9 9 2 ... Truncated |
Test 13
Group: 4, 5
Verdict: WRONG ANSWER
input |
---|
100 100 51 5 85 77 91 84 ... |
correct output |
---|
YES 100 24 100 25 100 3 100 6 ... |
user output |
---|
NO NO NO YES 13 6 ... Truncated |
Test 14
Group: 4, 5
Verdict: WRONG ANSWER
input |
---|
100 100 823828194 863717310 593641073 340054211 420481158 965069109 ... |
correct output |
---|
YES 999289319 634855378 996775156 433726648 983657502 55234695 981890636 112877413 ... |
user output |
---|
NO NO NO NO NO ... Truncated |
Test 15
Group: 2, 5
Verdict: TIME LIMIT EXCEEDED
input |
---|
100 500 88724450 89315226 266915464 267648621 189301651 189661541 ... |
correct output |
---|
YES 764920 1459946 1936195 2832987 3691481 4085931 4991808 5840928 ... |
user output |
---|
(empty) |
Test 16
Group: 3, 5
Verdict: TIME LIMIT EXCEEDED
input |
---|
100 500 763682761 317584504 756010800 260162861 435911339 78070399 ... |
correct output |
---|
YES 998768285 3307355 998714926 628486754 997115613 820932481 993320616 554600893 ... |
user output |
---|
(empty) |
Test 17
Group: 5
Verdict: ACCEPTED
input |
---|
100 500 2 2 2 1 1 2 ... |
correct output |
---|
YES 1 2 2 2 2 1 1 2 ... |
user output |
---|
YES 1 1 1 1 1 1 1 1 ... Truncated |
Test 18
Group: 5
Verdict: TIME LIMIT EXCEEDED
input |
---|
100 500 10 6 10 10 9 10 ... |
correct output |
---|
YES 2 3 3 4 4 5 5 6 ... |
user output |
---|
(empty) |
Test 19
Group: 5
Verdict: TIME LIMIT EXCEEDED
input |
---|
100 500 85 87 89 70 70 92 ... |
correct output |
---|
YES 96 97 100 67 100 10 100 97 ... |
user output |
---|
(empty) |
Test 20
Group: 5
Verdict: TIME LIMIT EXCEEDED
input |
---|
100 500 861154169 119512584 569086662 606567153 288230434 322196278 ... |
correct output |
---|
YES 999945324 969534372 999738857 240617694 999244114 722161553 999207839 557351400 ... |
user output |
---|
(empty) |
Test 21
Group: 5
Verdict: TIME LIMIT EXCEEDED
input |
---|
100 500 116439250 401518028 280329609 193466222 674040956 209050570 ... |
correct output |
---|
NO YES 773701149 773852119 987509190 315670966 977413249 510418200 ... |
user output |
---|
(empty) |
Test 22
Group: 5
Verdict: TIME LIMIT EXCEEDED
input |
---|
100 500 934181189 942499518 684836806 395802802 957884803 570946201 ... |
correct output |
---|
YES 999772640 505132174 999111650 140844643 999028633 888134186 999020109 291046771 ... |
user output |
---|
(empty) |