Submission #220189

#TimeUsernameProblemLanguageResultExecution timeMemory
220189rama_pangJOIRIS (JOI16_joiris)C++14
15 / 100
6 ms384 KiB
#include <iostream> #include <vector> using namespace std; int main() { int N, K; cin >> N >> K; vector<int> A(N); for (int i = 0; i < N; i++) { cin >> A[i]; } { // Check existence of solution vector<int> B(K); for (int i = 0; i < N; i++) { B[i % K] += A[i]; } for (int i = 0; i < N % K; i++) { if (B[i] != B[0]) { cout << -1 << "\n"; return 0; } } for (int i = N % K; i < K; i++) { if (B[i] != B[N % K]) { cout << -1 << "\n"; return 0; } } } vector<pair<int, int>> operations; // (type (0 vertical, 1 horizontal), leftmost column) { // Step 1: make A[0] <= A[1] <= ... <= A[N - 1] holds for (int i = 1; i < N; i++) { while (A[i - 1] > A[i]) { A[i] += K; operations.emplace_back(0, i); } } for (int i = N - 1; i >= 0; i--) { A[i] -= A[0]; // delete rows } } { // Step 2: Fill columns K - 1, K, ..., N - 1 with horizontal pieces for (int i = 1; i <= A[N - 1]; i++) { for (int j = N - 1; j >= 0; j--) { if (j + K - 1 < N && A[j + K - 1] < i) { operations.emplace_back(1, j); for (int k = j; k < j + K; k++) { A[k]++; } } } } } { // Step 3: Clear columns K - 1, K, ..., N - 1 by filling 0...K-2 with vertical pieces for (int i = 0; i < K - 1; i++) { while (A[i] < A[N - 1]) { operations.emplace_back(0, i); A[i] += K; } } for (int i = 0; i < N; i++) { A[i] -= A[N - 1]; // delete rows } } { // Step 4: Fill vertical pieces for A[0], ..., A[N % K - 1] so they are all the same. int mxheight = 0; for (int i = 0; i < N % K; i++) { mxheight = max(mxheight, A[i]); } for (int i = 0; i < N % K; i++) { while (A[i] < mxheight) { operations.emplace_back(0, i); A[i] += K; } } } { // Step 5: Fill vertical pieces for A[N % K], ..., A[N - 1] so they are all the same int mxheight = 0; for (int i = N % K; i < N; i++) { mxheight = max(mxheight, A[i]); } for (int i = N % K; i < N; i++) { while (A[i] < mxheight) { operations.emplace_back(0, i); A[i] += K; } } } { // Step 6: Make 0...N-1 the same height by adding horizontal positions int key = 0; for (int i = 0; i < N % K; i++) { while (A[i] < A[N % K]) { operations.emplace_back(0, i); A[i] += K; } key = A[i]; } for (int i = N % K; i < N; i += K) { while (A[i] < key) { operations.emplace_back(1, i); for (int j = i; j < i + K; j++) { A[j]++; } } } } cout << operations.size() << "\n"; for (auto &i : operations) { cout << i.first + 1 << " " << i.second + 1 << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...