Submission #94348

#TimeUsernameProblemLanguageResultExecution timeMemory
94348Noam527Triangles (CEOI18_tri)C++17
100 / 100
27 ms2804 KiB
#include <bits/stdc++.h> #define CHECK cout << "ok" << endl #define finish(x) return cout << x << endl, 0 typedef long long ll; typedef long double ldb; const int md = 1e9 + 7, inf = 1e9 + 7; using namespace std; void debug(string names) { cout << '\n'; } template<typename A1, typename... A2> void debug(string names, A1 par, A2... left) { int pos = 0; for (; pos < names.size() && names[pos] != ' ' && names[pos] != ','; pos++) cout << names[pos]; cout << ": " << par << " "; while (pos < names.size() && (names[pos] == ' ' || names[pos] == ',')) { pos++; } names.erase(names.begin(), names.begin() + pos); debug(names, left...); } struct fenwick { int n; vector<int> tree; fenwick() {} fenwick(int sz) { n = sz + 1; tree.resize(n, 0); } void upd(int pos) { for (pos++; pos <= n; pos += (pos & -pos)) tree[pos]++; } int query(int pos) { int rtn = 0; for (pos++; pos; pos -= (pos & -pos)) rtn += tree[pos]; return rtn; } int query(int l, int r) { return query(r) - query(l - 1); } }; #include "trilib.h" /* int get_n() { cout << "n? "; int n; cin >> n; return n; } bool is_clockwise(int a, int b, int c) { cout << "clock " << a << " " << b << " " << c << " "; bool rtn; cin >> rtn; return rtn; } void give_answer(int s) { cout << "answer: " << s << '\n'; } */ bool clock(int a, int b, int c) { return is_clockwise(1 + a, 1 + b, 1 + c); } int n; bool cmp(int a, int b) { return clock(0, a, b); } void merge(vector<int> &a, int l, int r) { static int A[40404]; int mid = (l + r) / 2, nl = l, nr = mid + 1, nxt = l; while (nl <= mid && nr <= r) { if (cmp(a[nl], a[nr])) A[nxt++] = a[nl++]; else A[nxt++] = a[nr++]; } while (nl <= mid) A[nxt++] = a[nl++]; while (nr <= r) A[nxt++] = a[nr++]; for (int i = l; i <= r; i++) a[i] = A[i]; } void msort(vector<int> &a, int l, int r) { if (l >= r) return; int mid = (l + r) / 2; msort(a, l, mid); msort(a, mid + 1, r); merge(a, l, r); } int main() { ios::sync_with_stdio(0), cin.tie(0); n = get_n(); vector<int> L, R; L.push_back(1); for (int i = 2; i < n; i++) if (clock(0, 1, i)) R.push_back(i); else L.push_back(i); msort(L, 0, (int)L.size() - 1); msort(R, 0, (int)R.size() - 1); L.insert(L.begin(), 0); vector<int> c; for (auto &i : L) { while (c.size() >= 2 && !clock(c[c.size() - 2], c.back(), i)) c.pop_back(); c.push_back(i); } for (auto &i : R) { while (c.size() >= 2 && !clock(c[c.size() - 2], c.back(), i)) c.pop_back(); c.push_back(i); } int val = c.size(); for (auto &i : L) { while (c.size() >= 2 && !clock(c[c.size() - 2], c.back(), i)) c.pop_back(); c.push_back(i); } for (auto &i : R) { while (c.size() >= 2 && !clock(c[c.size() - 2], c.back(), i)) c.pop_back(); c.push_back(i); } give_answer((int)c.size() - val); }
#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...