#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T> bool maximize(T &a, const T &b){ return (a < b ? a = b, 1 : 0); }
template<class T> bool minimize(T &a, const T &b){ return (a > b ? a = b, 1 : 0); }
#define fi first
#define se second
#define pb push_back
#define ii pair<int, int>
#define all(x) x.begin(), x.end()
#define TASK "nonsense"
/// end of template ///
const int lim = 50;
const int N = 55;
int n,k,a[N],d[N];
vector<int> cc[N];
vector<ii> history;
void print()
{
for (int i=1; i<=n; ++i) cout<<a[i]<<' ';
cout<<'\n';
}
void ver(int x)
{
history.pb(make_pair(1,x));
}
void hor(int x)
{
history.pb(make_pair(2,x));
}
void addSelf(int &x, int val)
{
x+=val;
if (x>=k) x-=k;
else if (x<0) x+=k;
}
int returnSelf(int x, int val)
{
x+=val;
if (x>=k) x-=k;
else if (x<0) x+=k;
return x;
}
void relax()
{
int mn=INT_MAX;
for (int i=1; i<=n; ++i) minimize(mn,a[i]);
for (int i=1; i<=n; ++i) a[i]-=mn;
}
void add(int x, int val)
{
for (int i=1; i<=n; ++i)
{
if (x<=i && i<=x+k-1) continue;
ver(i); a[i]+=k;
ver(i); a[i]+=k;
}
for (int i=1; i<=val; ++i)
{
hor(x);
}
for (int j=x; j<=x+k-1; ++j) a[j]+=val;
for (int i=1; i<=n; ++i)
{
a[i]-=val;
while (a[i]<2*k)
{
ver(i);
a[i]+=k;
}
}
relax();
}
void solve()
{
cin>>n>>k;
for (int i=1; i<=n; ++i)
{
cin>>a[i];
while (a[i]<k*lim)
{
ver(i);
a[i]+=k;
}
}
relax();
// print();
// for (int i=1; i<=n; ++i) cout<<a[i]<<' ';
// cout<<'\n';
for (int i=1; i<=n; ++i) d[i]=returnSelf(a[i],-a[i-1]);
// for (int i=1; i<=n; ++i) cout<<d[i]<<' ';
// return;
set<int> spec;
if (k+1<=n) spec.insert((k+1)%k);
if (n+1-k>=2) spec.insert((n+1-k)%k);
for (int i=2; i<=n; ++i) cc[i%k].pb(i);
for (int j=0; j<k; ++j) if(!spec.count(j))
{
// cout<<j<<'\n';
int sum=0;
for (int x : cc[j]) sum=(sum+d[x])%k;
if (sum!=0) return void(cout<<-1);
int sz=(int)cc[j].size();
for (int i=0; i<sz-1; ++i)
{
int x=cc[j][i];
int val=returnSelf(k-d[x],0);
// cout<<x<<' '<<val<<' '<<k<<' '<<d[x]<<'\n';
addSelf(d[x+k],-val);
d[x]=0;
// sum=0;
// for (int x : cc[j]) addSelf(sum,d[x]);
// if (sum!=0) return void(cout<<1/0);
// if (cc[j][i+1]!=x+k) return void(cout<<1/0);
// sum=0;
// for (int p=i+1; p<sz; ++p) addSelf(sum,d[cc[j][p]]);
// if (sum!=0) return void(cout<<1/0);
add(x,val);
}
// for (int x : cc[j]) if (d[x]!=0) return void(cout<<1/0);
// sum=0;
// for (int x : cc[j]) addSelf(sum,d[x]);
// if (sum!=0) return void(cout<<1/0);
// if(sz>1 && returnSelf(0,d[cc[j][sz-1]])!=0) return void(cout<<1/0);
}
// for (int j=0; j<k; ++j)
// {
// for (int x : cc[j]) cout<<x<<' ';
// cout<<'\n';
// }
// return;
for (int j : spec)
{
int sz=(int)cc[j].size();
if (n+1-k>=2 && (n+1-k)%k==j%k)
{
for (int i=0; i<sz-1; ++i)
{
int x=cc[j][i];
int val=returnSelf(k-d[x],0);
addSelf(d[x+k],-val);
add(x,val);
}
int x=cc[j][sz-1];
int val=returnSelf(k-d[x],0);
// cout<<x<<' '<<val<<'\n';
add(x,val);
}
else
{
for (int i=sz-1; i>=1; --i)
{
int x=cc[j][i];
int val=d[x];
addSelf(d[x-k],val);
add(x-k,val);
}
add(1,d[cc[j][0]]);
// cout<<1<<' '<<cc[j][0]<<'\n';
}
}
// for (int i=1; i<n; ++i) if (a[i]!=a[i+1]) return void(cout<<1/0);
// for (int i=1; i<n; ++i) if (a[i]!=a[i+1]) return void(cout<<"WTF");
// for (int i=1; i<=n; ++i) cout<<a[i]<<' ';
// return;
if ((int)history.size()>10000) return void(cout<<1/0);
cout<<(int)history.size()<<'\n';
for (ii cm : history) cout<<cm.fi<<' '<<cm.se<<'\n';
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen(TASK".inp","r",stdin);
// freopen(TASK".out","w",stdout);
int testcase=1;
// cin>>testcase;
while (testcase--)
solve();
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
joiris.cpp: In function 'void solve()':
joiris.cpp:177:55: warning: division by zero [-Wdiv-by-zero]
177 | if ((int)history.size()>10000) return void(cout<<1/0);
| ~^~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |