Submission #497320

#TimeUsernameProblemLanguageResultExecution timeMemory
497320SirCovidThe19thTeams (CEOI11_tea)C++17
70 / 100
2561 ms66736 KiB
#include <bits/stdc++.h> using namespace std; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; pair<int, int> A[n + 1]; for (int i = 1; i <= n; i++) cin >> A[i].first, A[i].second = i; sort(A + 1, A + n + 1); auto maxTeams = [&](int mxsz, bool get){ int dp[n + 1] = {}, sz[n + 1] = {}, l = 0, r = 0; set<pair<int, int>> vals; vals.insert({0, 0}); for (int i = 1; i <= n; i++){ int newL = max(i - mxsz, 0), newR = i - A[i].first; if (newR < newL){ dp[i] = -1e9; continue; } while (r < newR) r++, vals.insert({dp[r], r}); while (r > newR) vals.erase({dp[r], r}), r--; while (l < newL) vals.erase({dp[l], l}), l++; dp[i] = vals.rbegin()->first + 1; sz[i] = i - vals.rbegin()->second; } if (get){ cout<<dp[n]<<"\n"; for (int pos = n; pos; pos -= sz[pos]){ cout<<sz[pos]<<" "; for (int i = pos; i > pos - sz[pos]; i--) cout<<A[i].second<<" "; cout<<"\n"; } } return dp[n]; }; int L = 1, H = n, mx = maxTeams(1e9, 0); while (L < H){ int M = (L + H) / 2; (maxTeams(M, 0) == mx) ? H = M : L = M + 1; } maxTeams(H, 1); }
#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...
#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...