Submission #1268733

#TimeUsernameProblemLanguageResultExecution timeMemory
1268733MMihalevJOIRIS (JOI16_joiris)C++20
30 / 100
1095 ms8792 KiB
#include<iostream> #include<vector> using namespace std; const int MAX_N=55; const int MAX=202; bool stat[MAX+5][MAX+5]; int a[MAX_N]; int n,k; vector<pair<int,int>>ans; void rem(int target_row) { for(int row=target_row;row<=MAX;row++) { for(int col=1;col<=n;col++) { stat[row][col]=stat[row+1][col]; } } } bool full(int row) { for(int col=1;col<=n;col++) { if(stat[row][col]==0)return 0; } return 1; } void fix() { for(int row=1;row<=MAX;row++) { while(full(row))rem(row); } for(int col=1;col<=n;col++) { a[col]=0; while(stat[a[col]+1][col])a[col]++; } } void puthorizontal(int x) { int y=0; for(int col=x;col<=x+k-1;col++) { y=max(y,a[col]); } for(int col=x;col<=x+k-1;col++) { stat[y+1][col]=1; } fix(); ans.push_back({2,x}); } void putvertical(int x) { int y=a[x]+1; for(int row=y;row<=y+k-1;row++) { stat[row][x]=1; } fix(); ans.push_back({1,x}); } int firstbad() { for(int i=2;i<=n;i++) { if(a[i]<a[i-1])return i; } return n+1; } int sum() { int res=0; for(int i=1;i<=n;i++)res+=a[i]; return res; } int zeroes() { ///assuming that we enter with at least one positive for(int i=2;i<=n;i++) { if(a[i]!=0)return i-1; } } int lessthaneq(int val) { for(int i=1;i<=n;i++) { if(a[i]>val)return i-1; } return n; } void check() { for(int i=1;i<=n;i++) { cout<<a[i]<<" "; }cout<<"\n"; } void print() { cout<<ans.size()<<"\n"; for(auto [type,where]:ans) { cout<<type<<" "<<where<<"\n"; } } void balance() { while(firstbad()<=n) { int i=firstbad(); while(a[i]<a[i-1]) { putvertical(i); } } } void solve() { if(n%k==0 && sum()%k!=0) { cout<<-1<<"\n"; return; } balance(); while(sum()!=0) { int idxzeroes=zeroes(); int nextval=a[idxzeroes+1]; nextval=(nextval/k); while(nextval>0) { for(int i=1;i<=idxzeroes;i++) { putvertical(i); } nextval--; } if(a[idxzeroes+1]==0)continue; for(int i=idxzeroes-k+1;i>=1;i-=k) { puthorizontal(i); } if(idxzeroes%k==0) { continue; } int idxsecondbest=lessthaneq(k-1); int timess=k-a[idxzeroes+1]; for(int i=idxsecondbest-k+1;i>=1;i-=k) { int timesss=timess; while(timesss--)puthorizontal(i); } if(idxsecondbest%k!=0) { if((idxsecondbest/k)*k+idxzeroes<idxsecondbest) { for(int i=1;i<=idxzeroes;i++) { putvertical(i); } } else { for(int i=1;i<=idxsecondbest%k;i++) { putvertical(i); } } } balance(); } print(); } int main () { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n>>k; for(int i=1;i<=n;i++) { cin>>a[i]; for(int row=1;row<=a[i];row++)stat[row][i]=1; } solve(); return 0; }

Compilation message (stderr)

joiris.cpp: In function 'int zeroes()':
joiris.cpp:85:1: warning: control reaches end of non-void function [-Wreturn-type]
   85 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...