제출 #1125819

#제출 시각아이디문제언어결과실행 시간메모리
1125819AngusRitossaMountains (IOI17_mountains)C++20
40 / 100
3 ms840 KiB
#include "mountains.h" #include <bits/stdc++.h> using namespace std; #define int long long #define f first #define s second #ifdef LOCAL #define err cout #else #define err if (0) cout #endif vector<vector<int>> make_graph (vector<int> y){ int n = y.size(); vector<vector<int>> ret(n); for (int i = 0; i < n; i++){ vector<int> vt(n-i-1); iota(vt.begin(), vt.end(), i+1); sort(vt.begin(), vt.end(), [&](int a, int b){ if ((y[a]-y[i])*(b-i) == (y[b]-y[i])*(a-i)) return a > b; return (y[a]-y[i])*(b-i) > (y[b]-y[i])*(a-i); }); int mn = INT_MAX; for (int j : vt){ if (mn > j){ ret[i].push_back(j); ret[j].push_back(i); } mn = min(mn, j); } } return ret; } signed maximum_deevs(std::vector<signed> y){ vector<int> z; for (int i : y) z.push_back(i); auto adj = make_graph(z); int n = y.size(); vector<int> cnt(n); vector<bool> been(n, 0), bad(n, 0); for (int i = 0; i < n; i++) cnt[i] = adj[i].size(); for (int k = n; k--;){ pair<int, int> best = {INT_MAX, -1}; for (int i = 0; i < n; i++) if (!been[i] && !bad[i]) best = min(best, {cnt[i], i}); if (!~best.s) break; been[best.s] = true; for (int i : adj[best.s]){ if (bad[i]) continue; if (been[i]) continue; bad[i] = true; for (int j : adj[i]) cnt[j]--; } } return count(bad.begin(), bad.end(), 0); } #undef int #undef f #undef s #undef err
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...