Submission #155798

#TimeUsernameProblemLanguageResultExecution timeMemory
155798georgerapeanuJOIRIS (JOI16_joiris)C++11
100 / 100
5 ms632 KiB
#include <cstdio> #include <cassert> #include <cstring> #include <vector> #include <algorithm> using namespace std; int n,k; int a[55]; int tmp[55]; int cnt[55]; int ord[55]; int growth[55]; vector<pair<int,int> > op; int dist(int a,int b) { if(a > b) { b += k; } return b - a; } void get_same_height_range() { int ma = 0; for(int i = 1; i <= n; i++) { ma = max(ma,a[i]); } for(int i = 1; i <= n; i++) { while(ma - a[i] >= k) { a[i] += k; op.push_back({1,i}); } } } void paralel(vector<pair<int,int> > &v) { memset(growth,0,sizeof(growth)); for(auto it:v) { for(int x = 1; x <= it.second; x++) { op.push_back({2,it.first}); } for(int j = it.first; j < it.first + k; j++) { a[j] += it.second; growth[j] += it.second; } } sort(ord + 1,ord + 1 + n,[&](int x,int y) { return growth[x] < growth[y]; }); for(int i = 1; i <= n; i++) { if(growth[ord[i]] > 0) { continue; } a[ord[i]] += 2 * k; op.push_back({1,ord[i]}); op.push_back({1,ord[i]}); } } void do_tetris() { int mi = a[1]; for(int i = 1; i <= n; i++) { mi = min(mi,a[i]); } for(int i = 1; i <= n; i++) { a[i] -= mi; } } int main() { scanf("%d %d",&n,&k); for(int i = 1; i <= n; i++) { scanf("%d",&a[i]); } int real_h = -1; for(int h = 0; h < k; h++) { for(int i = 1; i <= n; i++) { tmp[i] = a[i] % k; } for(int i = 1; i <= n - k + 1; i++) { cnt[i] = dist(tmp[i],h); for(int j = i; j < i + k; j++) { tmp[j] += cnt[i]; tmp[j] %= k; } } bool ok = true; for(int i = 1; i <= n; i++) { ord[i] = i; if(tmp[i] != h) { ok = false; break; } } if(ok) { real_h = h; break; } } if(real_h == -1) { printf("-1\n"); return 0; } for(int i = 1; i <= n; i++) { get_same_height_range(); do_tetris(); vector<pair<int,int> > pos; for(int j = i; j <= i; j += k) { pos.push_back({j,cnt[j]}); } paralel(pos); do_tetris(); } get_same_height_range(); assert((int)op.size() <= 1e4); printf("%d\n",(int)op.size()); for(auto it:op) { printf("%d %d\n",it.first,it.second); } return 0; }

Compilation message (stderr)

joiris.cpp: In function 'int main()':
joiris.cpp:77:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d",&n,&k);
     ~~~~~^~~~~~~~~~~~~~~
joiris.cpp:80:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&a[i]);
         ~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...