제출 #365482

#제출 시각아이디문제언어결과실행 시간메모리
365482kostia244popa (BOI18_popa)C++17
100 / 100
131 ms736 KiB
#pragma GCC optimize("Ofast,unroll-loops") #pragma GCC target("avx,avx2,sse,sse2") #ifdef EVAL #include"popa.h" #endif #include<bits/stdc++.h> #define all(x) begin(x), end(x) using namespace std; using ll = long long; namespace local { int ar[10010], qc = 0; int query(int a, int b, int c, int d) { qc++; int x = 0, y = 0; for(;a<=b;a++) x = __gcd(x, ar[a]); for(;c<=d;c++) y = __gcd(y, ar[c]); return x==y; } }; #ifndef EVAL using namespace local; #endif int nnn; int q69(int a, int b, int c, int d) { if(min(a, c) < 0 || max(b, d) >= nnn || a > b || c > d) exit(7); return query(a, b, c, d); } #define query q69 int solve(int n, int *L, int *R) { nnn = n; vector<int> st {0}; int rt = 0; vector<int> start(n); for(int i = 0; i < n; i++) L[i] = R[i] = -1; for(int i = 1; i < n; i++) { int ins = 0; while(st.size()) { int v = st.back(); if(R[v] == -1) {//try becoming right child if(query(start[v], i, v, v)) {//possible R[v] = i; start[i] = i; ins = 1;break; } else { st.pop_back(); } } else {//try putting right child as my left child if(!query(start[v], i, v, v)) { st.pop_back();continue; } int vr = R[v]; if(696969) {//query(start[vr], i, i, i) R[v] = i; L[i] = vr; start[i] = start[vr]; ins = 1;break; } else { st.pop_back(); } } } if(!ins) { L[i] = rt; start[i] = 0; rt = i; } st.push_back(i); } return rt; } #ifndef EVAL int main() { cin.tie(0)->sync_with_stdio(0); //multitest([&](){}); int n; cin >> n; for(int i = 1; i <= n; i++) cin >> ar[i]; vector<int> L(n), R(n); cout << solve(n, L.data(), R.data()) << endl; for(int i = 0; i < n; i++) cout << L[i] << " " << R[i] << '\n'; cout << " :: " << qc << endl; } #endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...