Submission #552905

#TimeUsernameProblemLanguageResultExecution timeMemory
552905blueTeams (CEOI11_tea)C++17
100 / 100
463 ms162796 KiB
#include <iostream> #include <vector> using namespace std; using vi = vector<int>; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int N; cin >> N; vi lst[1+N]; for(int i = 1; i <= N; i++) { int a; cin >> a; lst[a].push_back(i); } vi A(1, 0); vi I(1, 0); for(int i = N; i >= 1; i--) { for(int x : lst[i]) { A.push_back(i); I.push_back(x); } } vi maxteams(1+N); vi sizelim(1+N, 5'000'000); maxteams[0] = sizelim[0] = 0; vi occ[1+N+1]; if(A[1] + 1 <= N+1) occ[A[1] + 1].push_back(1); for(int i = A[1]+1; i <= N; i++) { if(A[i] + i <= N+1) occ[A[i] + i].push_back(i); } for(int i = A[1]; i <= N; i++) { // cerr << "i = " << i << '\n'; // if(i < A[1]) // { // maxteams[i] = sizelim[i] = prev[i] = -1; // continue; // } maxteams[i] = 0; for(int j : occ[i+1]) { if(j > i) continue; if(maxteams[j-1] != maxteams[i-1]) continue; int currsize = max(sizelim[j-1], i-j+1); if(maxteams[i] == 0 || sizelim[i] > currsize) { maxteams[i] = maxteams[i-1] + 1; sizelim[i] = currsize; } } // cerr << "phase 1 : " << maxteams[i] << '\n'; if(maxteams[i] == 0) { maxteams[i] = maxteams[i-1]; if(maxteams[i-1] * sizelim[i-1] == i-1) { sizelim[i] = sizelim[i-1] + 1; } else { sizelim[i] = sizelim[i-1]; } // for(int j = 1; j <= i; j++) if(A[j] <= i-j+1) for(int j : occ[i+1]) { // if(A[j] > i-j+1) continue; if(j > i) continue; if(maxteams[j-1] != maxteams[i] - 1) continue; int currsize = max(sizelim[j-1], i-j+1); if(sizelim[i] > currsize) { sizelim[i] = currsize; } } } } vi teamocc[1+N]; for(int i = A[1]; i <= N; i++) teamocc[maxteams[i]].push_back(i); teamocc[0].push_back(0); // for(int i = 1; i <= N; i++) cerr << A[i] << ' ' << I[i] << " : " << maxteams[i] << ' ' << sizelim[i] << '\n'; int ci = N; cout << maxteams[N] << '\n'; for(int z = 1; z <= maxteams[N]; z++) { int pci = 0; for(int i : teamocc[maxteams[ci]-1]) { if(sizelim[i] <= sizelim[N] && maxteams[i] == maxteams[ci] - 1 && A[i+1] <= ci - i && ci - i <= sizelim[N]) { pci = i; break; } } // cerr << ci << " -> " << pci << '\n'; // cerr << "ci = " << ci << '\n'; cout << ci - pci << ' '; for(int q = pci+1; q <= ci; q++) cout << I[q] << ' '; cout << '\n'; ci = pci; } }
#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...