Submission #1113552

#TimeUsernameProblemLanguageResultExecution timeMemory
1113552PagodePaivaAlternating Current (BOI18_alternating)C++17
19 / 100
115 ms17892 KiB
#include<bits/stdc++.h> #define fr first #define sc second using namespace std; const int N = 200010; struct Segtree{ pair <int, int> tree[4*N]; int lazy[4*N]; pair <int, int> join(pair <int, int> a, pair <int, int> b){ if(a.fr < b.fr) return a; else if(b.fr < a.fr) return b; if(a.sc < b.sc) return a; return b; } void unlazy(int node, int l, int r){ if(lazy[node] == 0) return; tree[node].first = lazy[node]; tree[node].second = l; if(l != r){ lazy[2*node] = lazy[node]; lazy[2*node+1] = lazy[node]; } lazy[node] = 0; } void build(int node, int l,int r){ lazy[node] = 0; if(l == r){ tree[node] = {0, l}; return; } int mid = (l+r)/2; build(2*node, l, mid); build(2*node+1, mid+1, r); tree[node] = join(tree[2*node], tree[2*node+1]); return; } void update(int node, int l, int r, int tl, int tr, int val){ unlazy(node, tl, tr); if(l > tr or tl > r) return; if(l <= tl and tr <= r){ lazy[node] = val; unlazy(node, tl, tr); return; } int mid = (tl+tr)/2; update(2*node, l, r, tl, mid, val); update(2*node+1, l, r, mid+1,tr, val); tree[node] = join(tree[2*node], tree[2*node+1]); return; } pair <int, int> query(int node, int l, int r, int tl, int tr){ unlazy(node, tl, tr); if(l > tr or tl > r) return {2, 0}; if(l <= tl and tr <= r) return tree[node]; int mid = (tl+tr)/2; return join(query(2*node, l, r, tl, mid), query(2*node+1, l, r, mid+1, tr)); } } seg[2]; vector <array <int, 3>> intervalos; int res[N]; int main(){ int n, m; cin >> n >> m; for(int i = 1;i <= m;i++){ int a, b; cin >> a >> b; intervalos.push_back({a, -b, i-1}); } sort(intervalos.begin(), intervalos.end()); for(int i = 0;i < m;i++){ intervalos[i][1] *= -1; } seg[0].build(1, 1, n); seg[1].build(1, 1, n); for(int i = 0;i < m;i++){ auto [l, r, _] = intervalos[i]; pair <int, int> a = seg[0].query(1, l, r, 1, n); pair <int, int> b = seg[1].query(1, l, r, 1, n); if(a.fr == 1 and b.fr == 1){ res[_] = 0; continue; } else if(a.fr == 1 and b.fr == 0){ res[_] = 1; seg[1].update(1, l, r, 1, n, 1); } else if(a.fr == 0 and b.fr == 1){ res[_] = 0; seg[0].update(1, l, r, 1, n, 1); } else{ if(a.sc < b.sc){ res[_] = 0; seg[0].update(1, l, r, 1, n, 1); } else{ res[_] = 1; seg[1].update(1, l, r, 1, n, 1); } } } if(seg[0].query(1, 1, n, 1, n).fr != 1 or seg[1].query(1, 1, n, 1, n).sc != 1){ cout << "impossible\n"; return 0; } for(int i = 0;i < m;i++){ cout << res[i]; } cout << '\n'; }
#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...