제출 #1254182

#제출 시각아이디문제언어결과실행 시간메모리
1254182trandangquangJOIRIS (JOI16_joiris)C++20
100 / 100
1 ms328 KiB
/// just for comfirming #include<bits/stdc++.h> #define ffor(i,a,b) for(int i=(a);i<=(b);i++) #define roff(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; const int MAXN=50+10; int n,k,a[MAXN],b[MAXN],pre[MAXN],bs=-1; int check(int g) { ffor(i,1,n) b[i]=((g-a[i])%k+k)%k; memset(pre,0,sizeof(pre)); ffor(i,1,n-k+1) { pre[i]+=pre[i-1]; b[i]=((b[i]-pre[i])%k+k)%k; pre[i+1]+=b[i],pre[i+k]-=b[i]; } ffor(i,n-k+2,n) { pre[i]+=pre[i-1]; if((b[i]-pre[i])%k!=0) return 0; } return 1; } vector<pair<int,int>> ans; void clear(void) { int mn=*min_element(a+1,a+n+1); ffor(i,1,n) a[i]-=mn; if(*max_element(a+1,a+n+1)>=k) { int mx=*max_element(a+1,a+n+1); ffor(i,1,n) while(mx-a[i]>=k) a[i]+=k,ans.push_back({1,i}); } mn=*min_element(a+1,a+n+1); ffor(i,1,n) a[i]-=mn; return ; } int main() { // freopen("tetris.in","r",stdin); // freopen("tetris.out","w",stdout); ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); cin>>n>>k; ffor(i,1,n) cin>>a[i]; ffor(i,0,k-1) if(check(i)) {bs=i;break ;} if(bs==-1) return cout<<-1,0; int flg=0; ffor(i,1,n) b[i]=((bs-a[i])%k+k)%k; ffor(i,1,n-k+1) { int add=(b[i]%k+k)%k,mx=0; if(add) { ffor(j,i,i+k-1) mx=max(mx,a[j]); mx+=add; ffor(j,1,add) ans.push_back({2,i}); ffor(j,1,n) if(!(i<=j&&j<=i+k-1)) { while(a[j]<mx) ans.push_back({1,j}),a[j]+=k; a[j]-=add; } ffor(j,i,i+k-1) b[j]=(b[j]-add)%k; flg=1,clear(); } } if(!flg) ans.push_back({1,1}),a[1]+=k; int mx=*max_element(a+1,a+n+1); ffor(i,1,n) while(a[i]<mx) a[i]+=k,ans.push_back({1,i}); cout<<ans.size()<<'\n'; for(auto pr:ans) cout<<pr.first<<' '<<pr.second<<'\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...