This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
#define INF 1000000009
struct Switch{
int cur = 0;
vector<int> ch = {-INF, -INF};
Switch(){}
};
struct Trigger{
int next = -INF;
Trigger(){}
};
void create_circuit(int m, vector<int> events) {
events.push_back(0);
int n = events.size();
vector<int> cnt(m+1, 0);
for(int i = 0; i<n; i++) cnt[events[i]]++;
vector<Trigger> triggers(m+1);
// cout << n << endl;
vector<Switch> switches(2*n);
// cout << 1 << endl;
vector<int> par(2*n);
// cout << 1 << endl;
int curSwitch = 1;
for(int i = 0; i<=m; i++){
if(cnt[i] == 1) continue;
if(cnt[i] == 0){
triggers[i].next = 0;
continue;
}
queue<int> q;
triggers[i].next = -curSwitch;
par[curSwitch] = i;
q.push(curSwitch++);
int curCnt = 2;
while(curCnt < cnt[i]){
int s = q.front();
q.pop();
switches[s].ch[0] = -(curSwitch++);
switches[s].ch[1] = -(curSwitch++);
curCnt += 2;
q.push(-switches[s].ch[0]);
q.push(-switches[s].ch[1]);
par[-switches[s].ch[0]] = -s;
par[-switches[s].ch[1]] = -s;
}
}
stack<int> st;
st.push(0);
int ind = 0;
bool lol = false;
while(ind < n){
int v = st.top();
st.pop();
if(v >= 0){
if(triggers[v].next == -INF) triggers[v].next = events[ind];
if(triggers[v].next == events[ind]) ind++;
st.push(triggers[v].next);
}
else{
v = -v;
if(switches[v].ch[switches[v].cur] == -INF) switches[v].ch[switches[v].cur] = events[ind];
if(switches[v].ch[switches[v].cur] == events[ind]){
if(ind != n-1 || par[v] >= 0 || lol || switches[par[v]].ch[1] == v) ind++;
else{
switches[v].ch[switches[v].cur] = par[v];
lol = true;
}
}
st.push(switches[v].ch[switches[v].cur]);
switches[v].cur = 1-switches[v].cur;
}
// cout << n-ind << endl;
}
// cout << switches[0].next << endl;
vector<int> C, X, Y;
C.resize(m+1);
for(int i = 1; i<curSwitch; i++){
X.push_back(switches[i].ch[0]);
Y.push_back(switches[i].ch[1]);
}
for(int i = 0; i<=m; i++) C[i] = triggers[i].next;
answer(C, X, Y);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |