Submission #624089

#TimeUsernameProblemLanguageResultExecution timeMemory
624089baluconisTimaMechanical Doll (IOI18_doll)C++14
100 / 100
310 ms34260 KiB
#pragma GCC optimize("O3") //#pragma GCC tagret("avx2") #include<bits/stdc++.h> #include <ext/pb_ds/detail/standard_policies.hpp> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define ll long long #define pb push_back #define ld long double #define f first #define s second using namespace std; using namespace __gnu_pbds; typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> oset; mt19937 gen(time(0)); const int MOD = 1e9 + 7; void answer(vector<int> C, vector<int> X, vector<int> Y); bool used[400007]; vector<int> X, Y; ll build(ll gl) { if(gl == 0) { X.pb(0); Y.pb(0); return X.size() - 1; } ll v1 = X.size(); X.pb(-1); Y.pb(-1); X[v1] = -build(gl - 1); Y[v1] = -build(gl - 1); return v1; } void go(ll v1, ll l, ll r, ll cr, ll root) { v1 = -v1; if(l + 1 == r) { if(l < cr) { X[v1] = root; } if(r < cr) { Y[v1] = root; } return; } ll mid = (l + r) / 2; go(X[v1], l, mid, cr, root); go(Y[v1], mid + 1, r, cr, root); } set<ll> recalc(ll v1, ll gl) { v1 = -v1; set<ll> st1, st2; if(gl == 0) { st1.insert(X[v1]); st2.insert(Y[v1]); } else { for(auto to: recalc(X[v1], gl - 1)) st1.insert(to); for(auto to: recalc(Y[v1], gl - 1)) st2.insert(to); } if(st1.size() == 1) { X[v1] = *st1.begin(); } if(st2.size() == 1) { Y[v1] = *st2.begin(); } for(auto to: st2) st1.insert(to); while(st1.size() > 2) st1.erase(*st1.rbegin()); return st1; } bool col(ll v1, ll x, ll gl) { v1 = -v1; if(gl == 0) { used[v1] ^= 1; if(used[v1]) { if(X[v1] != 0) return 0; X[v1] = x; } else { if(Y[v1] != 0) return 0; Y[v1] = x; } return 1; } bool f = 0; if(!used[v1]) f = col(X[v1], x, gl - 1); else f = col(Y[v1], x, gl - 1); used[v1] ^= 1; return f; } void dob(ll v1, ll x, ll gl) { while(true) { if(col(v1, x, gl)) break; } } void create_circuit(int M, vector<int> B) { //if(A.size() != 16) exit(-1); X.clear(); Y.clear(); vector<ll> A; for(int i = 1; i < B.size(); i++) { A.pb(B[i]); } A.pb(0); vector<int> sl(M + 1, 0); X.pb(0); Y.pb(0); ll now = 0; while((2 << now) < A.size()) { now++; } ll root = -build(now); for(auto &to: sl) to = root; ll d = (2 << now) - A.size(); go(root, 0, (2 << now) - 1, d, root); for(auto to: A) { dob(root, to, now); } recalc(root, now); sl[0] = B[0]; set<ll> all; for(auto to: sl) { if(to < 0) all.insert(-to); } for(int i = 1; i < X.size(); i++) { if(X[i] < 0) all.insert(-X[i]); if(Y[i] < 0) all.insert(-Y[i]); } map<ll,ll> mp; ll e = -1; for(auto to: all) { mp[to] = e; e--; } vector<int> x, y; for(int i = 1; i < X.size(); i++) { if(!all.count(i)) continue; if(X[i] >= 0) x.pb(X[i]); else x.pb(mp[-X[i]]); if(Y[i] >= 0) y.pb(Y[i]); else y.pb(mp[-Y[i]]); } for(auto &to: sl) { if(to < 0) to = mp[-to]; } answer(sl, x, y); } #ifdef LOCAL int32_t main() { } #endif

Compilation message (stderr)

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:117:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  117 |     for(int i = 1; i < B.size(); i++) {
      |                    ~~^~~~~~~~~~
doll.cpp:126:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  126 |     while((2 << now) < A.size()) {
      |           ~~~~~~~~~~~^~~~~~~~~~
doll.cpp:145:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  145 | for(int i = 1; i < X.size(); i++) {
      |                ~~^~~~~~~~~~
doll.cpp:157:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  157 | for(int i = 1; i < X.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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...