| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1366233 | opeleklanos | Toy Design (EGOI22_toydesign) | C++20 | 0 ms | 0 KiB |
#include <iostream>
#include <vector>
using namespace std;
#include "ToyDesign.h"
int lastLevel = 0;
vector<int> rep;
struct segTree{
int l; int r;
int leader;
segTree * lc, * rc;
int level;
segTree(int ind){
leader = rep[ind];
l = r = ind;
level = 0;
lc = rc = nullptr;
}
segTree(segTree*le, segTree*ri){
lc = le;
rc = ri;
l = lc->l;
r = rc->r;
leader = lc->leader;
level = Connected(lc->level, lc->leader, rc->leader);
lastLevel = level;
}
};
segTree * build(int l, int r){
int mid = (l+r)/2;
if(l==r) return new segTree(l);
else return new segTree(build(l, mid), build(mid+1, r));
}
int query(segTree * st, int nd){
if(st->l == st->r) return st->leader;
if(st->lc->level == Connected(st->lc->level, nd, st->lc->leader)) return query(st->lc, nd);
else return query(st->rc, nd);
}
void ToyDesign(int n, int max_ops){
rep.clear();
rep.push_back(1);
for(int i = 2; i<=n; i++){
int b = Connected(lastLevel, 1, i);
if(b>lastLevel) rep.push_back(i);
lastLevel = b;
}
segTree * seg = build(0, rep.size()-1);
vector<pair<int, int>> ans;
int repind = 0;
for(int i = 1; i<=n; i++){
if(i == rep[repind]){
repind++;
continue;
}
ans.push_back({i, query(seg, i)});
}
DescribeDesign(ans);
}
