Submission #708727

#TimeUsernameProblemLanguageResultExecution timeMemory
708727yuuhiAncient Machine (JOI21_ancient_machine)C++17
0 / 100
2080 ms44468 KiB
#include<bits/stdc++.h> #include "Anna.h" #define f first #define s second #define double long double #define _size(x) ((int)((x).size())) using namespace std ; typedef pair< int , int > ii ; void Anna (int n , vector< char > s) { for (int i = 0 ; i < n ; ++ i) { if (s[i] == 'X') { Send(0) ; Send(0) ; } else if (s[i] == 'Y') { Send(0) ; Send(1) ; } else { Send(1) ; Send(0) ; } } }
#include<bits/stdc++.h> #include "Bruno.h" #define f first #define s second #define double long double #define _size(x) ((int)((x).size())) using namespace std ; typedef pair< int , int > ii ; void Bruno (int n , int L , vector< int > b) { vector< int > a(n) ; for (int i = 0 ; i < n ; ++ i) { a[i] = (b[i << 1] << 1) | b[i << 1 | 1] ; } vector< int > erased(n , 0) ; set< int > cand ; set< int > l , r , s ; for (int i = 0 ; i < n ; ++ i) { if (a[i] == 1) { int j = i ; while (j + 1 < n && a[j + 1] == 1) j ++ ; cand.insert(i) ; i = j ; } else if (a[i] == 0) { l.insert(i) ; } else { r.insert(i) ; } } for (int i = 0 ; i < n ; ++ i) s.insert(i) ; auto goodRemove = [&](int x) { auto itl = l.lower_bound(x) ; auto itr = r.upper_bound(x) ; if (itl == l.begin() || itr == r.end()) return 0 ; int ok = 1 ; auto it = cand.lower_bound(x) ; if (it != cand.begin()) { it -- ; if (*itl < *it) ok = 0 ; it ++ ; } // cout << ok << "\n" ; it ++ ; if (it != cand.end()) { if (*itr > *it) ok = 0 ; } // cout << ok << "\n" ; return ok ; }; auto Erase = [&](int x) { if (erased[x]) return ; erased[x] = 1 ; s.erase(s.find(x)) ; if (a[x] == 0) l.erase(l.find(x)) ; if (a[x] == 2) r.erase(r.find(x)) ; auto it = cand.find(x) ; if (it != cand.end()) cand.erase(it) ; Remove(x) ; // cout << x << "\n" ; }; auto goRemove = [&](int x) { auto itl = l.lower_bound(x) ; auto itr = r.upper_bound(x) ; int L = *itl , R = *itr ; while (1) { auto it = s.lower_bound(x) ; if (it == s.begin()) break ; it -- ; if (*it > L) Erase(*it) ; else break ; } while (1) { auto it = s.upper_bound(x) ; if (it == s.end()) break ; if (*it < R) Erase(*it) ; else break ; } Erase(x) ; }; queue< int > q ; for (int i : cand) { // cout << i << " " << goodRemove(i) << "\n" ; if (goodRemove(i)) q.push(i) ; } while (!q.empty()) { int x = q.front() ; q.pop() ; goRemove(x) ; auto it = s.upper_bound(x) ; if (it != s.end()) { if (goodRemove(*it)) q.push(*it) ; } if (it != s.begin()) { it -- ; if (goodRemove(*it)) q.push(*it) ; } } for (int i = 0 ; i < n ; ++ i) if (!erased[i]) Erase(i) ; } /* 4 X Y X Z */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...