QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#149267 | #5508. Job for a Hobbit | Flamire | AC ✓ | 10ms | 4668kb | C++14 | 3.0kb | 2023-08-24 11:39:20 | 2023-08-24 11:39:24 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
int t,n,k,a[55][15],cnt[55],mv[1000011][2],nmv;map<int,int> mp;
bool nd[55][15],mk[55][15];
void move(int x,int y)
{
a[y][++cnt[y]]=a[x][cnt[x]--];
mk[y][cnt[y]]=mk[x][cnt[x]+1];mk[x][cnt[x]+1]=0;
a[x][cnt[x]+1]=0;
++nmv;mv[nmv][0]=x;mv[nmv][1]=y;
}
void MoveL(int x)
{
if(cnt[x-1]==k)MoveL(x-1);
move(x,x-1);
}
void MoveR(int x)
{
if(cnt[x+1]==k)MoveR(x+1);
move(x,x+1);
}
void SingleCleanse(int x)
{
for(int i=2;i<=x;++i)
{
while(cnt[i])
{
if(nd[i][cnt[i]])move(i,i-1);
else move(i,i-1),move(i-1,i-2);
}
while(cnt[i-1])move(i-1,i);
}
}
void FullCleanse(int x)
{
while(cnt[0])MoveR(0);
while(cnt[1])MoveR(1);
int cur=0,all=0;
for(int i=2;i<=x;++i)
{
for(int _=1;_<=cnt[i];++_)if(mk[i][_]&&cur<k-1)++cur,nd[i][_]=1;else nd[i][_]=0;
for(int _=1;_<=cnt[i];++_)if(mk[i][_])++all;
}
SingleCleanse(x);
if(all>=k)
{
int id=-1;
for(int i=x-1;~i;--i)if(cnt[i]){id=i;break;}
for(int i=id;i<x;++i)move(i,i+1);
if(!mk[x][cnt[x]])
{
while(cnt[0])MoveR(0);
while(cnt[1])MoveR(1);
bool flg=0;
for(int i=2;i<x;++i)
{
for(int _=1;_<=cnt[i];++_)if(mk[i][_]&&!flg)nd[i][_]=flg=1;else nd[i][_]=0;
}
SingleCleanse(x-1);
MoveL(x);MoveL(x-1);
MoveR(x-1);
}
}
while(cnt[0])MoveR(0);
while(cnt[1])MoveR(1);
memset(mk,0,sizeof(mk));
}
void Sort(int x)
{
if(!cnt[x])return;
int mx=0;
for(int i=1;i<=cnt[x];++i)mx=max(mx,a[x][i]);
while(cnt[x])
{
if(a[x][cnt[x]]==mx)move(x,x-1),move(x-1,x-2);
else move(x,x-1);
}
while(cnt[x-1])move(x-1,x);
Sort(x);
}
int main()
{
scanf("%d",&t);while(t--)
{
scanf("%d%d",&n,&k);mp.clear();cnt[0]=cnt[n+1]=0;
for(int i=1;i<=n;++i)for(int j=1;j<=k;++j)scanf("%d",a[i]+j),++mp[a[i][j]];
if(k==1){printf("TAK\n0\n");continue;}
int ned=0;
for(auto x:mp)ned+=(x.second+k-1)/k;
if(ned>n+2){printf("NIE\n");continue;}
nmv=0;
for(int i=1;i<=n;++i)cnt[i]=k;
int ed=n+1;
for(auto x:mp)
{
for(int _=1;_<=x.second/k;++_)
{
int cur=0;
for(int i=0;i<=ed;++i)
{
for(int j=1;j<=cnt[i];++j)
{
if(cur<n&&a[i][j]==x.first)mk[i][j]=1;else mk[i][j]=0;
}
}
FullCleanse(ed--);
}
}
int ted=ed,cur=0;
for(auto x:mp)
{
bool flg=1;
while(flg)
{
flg=0;
for(int i=0;i<=ed;++i)
{
for(int j=1;j<=cnt[i];++j)
{
if(a[i][j]==x.first)
{
++cur;mk[i][j]=1;
if(cur==k){flg=1;cur=0;FullCleanse(ed--);break;}
}
}
if(flg)break;
}
}
}
if(cur)FullCleanse(ed--);
++ed;
for(int i=2;i<=ted;++i)Sort(i);
int lst=-1,lstp=ted+1;
for(int i=ted-2;~i;--i)
{
while(cnt[i]&&lstp!=i)
{
while(a[i][cnt[i]]==lst)for(int _=i;_<lstp;++_)move(_,_+1);
if(cnt[i])lst=a[i][cnt[i]],--lstp;
}
}
printf("TAK\n%d\n",nmv);
for(int i=1;i<=nmv;++i)printf("%d %d\n",mv[i][0],mv[i][1]);
}return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3896kb
input:
2 2 2 1 2 2 1 1 4 1 2 3 4
output:
TAK 24 2 3 1 2 2 3 1 2 2 1 2 1 1 0 1 2 3 2 2 1 3 2 2 1 2 3 1 2 2 3 0 1 1 2 1 2 2 1 1 0 2 1 1 2 0 1 1 2 NIE
result:
ok Correct! Used 24 swaps
Test #2:
score: 0
Accepted
time: 1ms
memory: 3896kb
input:
25 2 7 4 1 2 2 3 2 4 4 4 6 4 2 2 5 2 5 6 5 5 3 3 1 6 5 2 5 2 8 1 4 2 1 4 1 2 1 1 3 4 4 2 2 1 2 2 4 1 1 5 2 1 5 2 2 2 10 3 5 4 5 5 2 1 3 5 2 5 2 2 1 5 1 3 3 4 2 2 8 2 4 3 3 4 2 1 2 5 1 4 1 2 6 3 4 2 9 4 3 4 3 4 2 4 1 2 2 4 4 2 2 3 3 3 4 2 4 4 1 3 1 4 2 4 3 2 4 5 1 2 2 2 4 3 2 2 7 1 2 4 5 2 5 2 4 5 5 ...
output:
NIE NIE TAK 197 2 3 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 1 2 1 2 1 1 0 2 1 1 0 2 1 1 0 2 1 1 0 2 1 1 0 2 1 1 2 1 2 1 2 3 2 2 1 3 2 2 1 3 2 3 2 2 1 3 2 3 2 3 2 3 2 2 1 2 3 2 3 2 3 2 3 2 3 2 3 2 3 1 2 2 3 0 1 0 1 0 1 0 1 0 1 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 2 1 1 0 2 1 2 1 1 0 ...
result:
ok Correct! Used 1551 swaps
Test #3:
score: 0
Accepted
time: 8ms
memory: 4304kb
input:
1 50 10 2 2 2 2 2 1 2 1 1 2 2 1 2 1 1 2 2 2 2 2 2 1 1 2 2 2 2 1 1 1 2 2 1 2 2 2 1 1 1 2 2 1 1 2 1 2 2 1 2 1 2 1 2 1 1 1 2 1 2 2 1 2 1 1 2 2 1 1 2 1 2 2 1 1 2 2 2 1 1 2 1 2 2 2 2 1 1 2 1 1 2 2 2 1 2 1 1 2 1 1 2 2 1 2 2 1 1 1 1 1 1 2 2 1 2 2 2 1 1 1 2 2 2 1 2 2 1 1 2 2 1 2 1 2 1 1 1 1 2 2 1 2 1 1 2 2 ...
output:
TAK 80671 50 51 49 50 48 49 47 48 46 47 45 46 44 45 43 44 42 43 41 42 40 41 39 40 38 39 37 38 36 37 35 36 34 35 33 34 32 33 31 32 30 31 29 30 28 29 27 28 26 27 25 26 24 25 23 24 22 23 21 22 20 21 19 20 18 19 17 18 16 17 15 16 14 15 13 14 12 13 11 12 10 11 9 10 8 9 7 8 6 7 5 6 4 5 3 4 2 3 1 2 50 51 4...
result:
ok Correct! Used 80671 swaps
Test #4:
score: 0
Accepted
time: 10ms
memory: 4396kb
input:
1 50 10 33 28 16 37 35 47 28 35 31 21 47 40 33 25 16 40 50 25 13 33 10 14 48 38 1 38 32 43 28 18 11 16 1 51 4 45 16 31 27 41 52 18 32 51 17 31 38 48 49 47 5 24 20 48 51 20 29 32 35 20 39 18 21 45 10 30 11 5 32 32 5 46 19 39 30 26 15 17 15 8 15 15 21 25 41 28 6 8 6 20 47 28 34 12 44 16 48 49 52 47 23...
output:
TAK 97777 50 51 49 50 48 49 47 48 46 47 45 46 44 45 43 44 42 43 41 42 40 41 39 40 38 39 37 38 36 37 35 36 34 35 33 34 32 33 31 32 30 31 29 30 28 29 27 28 26 27 25 26 24 25 23 24 22 23 21 22 20 21 19 20 18 19 17 18 16 17 15 16 14 15 13 14 12 13 11 12 10 11 9 10 8 9 7 8 6 7 5 6 4 5 3 4 2 3 1 2 50 51 4...
result:
ok Correct! Used 97777 swaps
Test #5:
score: 0
Accepted
time: 2ms
memory: 3668kb
input:
5 10 1 11 2 10 3 1 12 8 4 5 7 10 7 11 5 6 5 2 1 2 8 7 1 9 10 6 4 6 8 4 6 2 12 9 12 3 10 5 11 4 7 9 11 4 2 9 3 9 6 7 5 11 1 10 6 11 7 6 7 12 1 1 5 3 2 3 4 7 12 3 8 11 9 12 9 8 1 12 12 4 10 1 2 10 7 9 8 12 8 10 7 4 1 1 10 7 3 5 1 11 6 11 5 2 4 12 6 12 8 3 8 6 8 12 7 4 1 11 8 6 7 6 2 5 9 3 6 12 10 4 9 ...
output:
TAK 0 TAK 2937 10 11 9 10 8 9 7 8 6 7 5 6 4 5 3 4 2 3 1 2 10 11 9 10 8 9 7 8 6 7 5 6 4 5 3 4 2 3 1 2 10 11 9 10 8 9 7 8 6 7 5 6 4 5 3 4 2 3 1 2 10 11 9 10 8 9 7 8 6 7 5 6 4 5 3 4 2 3 1 2 10 11 9 10 8 9 7 8 6 7 5 6 4 5 3 4 2 3 1 2 10 11 9 10 8 9 7 8 6 7 5 6 4 5 3 4 2 3 1 2 10 11 9 10 8 9 7 8 6 7 5 6 ...
result:
ok Correct! Used 7387 swaps
Test #6:
score: 0
Accepted
time: 5ms
memory: 3840kb
input:
2 25 10 27 26 27 26 27 26 27 26 27 26 26 27 26 27 26 27 26 27 26 27 25 25 25 25 25 25 25 25 25 25 24 24 24 24 24 24 24 24 24 24 23 23 23 23 23 23 23 23 23 23 22 22 22 22 22 22 22 22 22 22 21 21 21 21 21 21 21 21 21 21 20 20 20 20 20 20 20 20 20 19 19 19 19 19 19 19 19 19 18 18 18 18 18 18 18 18 18 1...
output:
TAK 25568 25 26 24 25 23 24 22 23 21 22 20 21 19 20 18 19 17 18 16 17 15 16 14 15 13 14 12 13 11 12 10 11 9 10 8 9 7 8 6 7 5 6 4 5 3 4 2 3 1 2 25 26 24 25 23 24 22 23 21 22 20 21 19 20 18 19 17 18 16 17 15 16 14 15 13 14 12 13 11 12 10 11 9 10 8 9 7 8 6 7 5 6 4 5 3 4 2 3 1 2 25 26 24 25 23 24 22 23 ...
result:
ok Correct! Used 50534 swaps
Test #7:
score: 0
Accepted
time: 7ms
memory: 4668kb
input:
1 50 10 1 1 1 37 35 47 1 35 31 21 47 40 1 25 1 40 1 25 13 1 10 14 48 38 1 38 32 43 1 18 11 1 1 1 4 45 1 31 27 41 1 18 32 1 17 31 38 48 49 47 1 24 1 48 1 1 29 32 35 1 39 18 21 45 10 30 11 1 32 32 1 46 19 39 30 26 15 17 15 8 15 15 21 25 41 1 6 8 6 1 47 1 34 12 1 1 48 49 1 47 23 18 1 1 37 1 41 1 2 30 4...
output:
TAK 98170 50 51 49 50 48 49 47 48 46 47 45 46 44 45 43 44 42 43 41 42 40 41 39 40 38 39 37 38 36 37 35 36 34 35 33 34 32 33 31 32 30 31 29 30 28 29 27 28 26 27 25 26 24 25 23 24 22 23 21 22 20 21 19 20 18 19 17 18 16 17 15 16 14 15 13 14 12 13 11 12 10 11 9 10 8 9 7 8 6 7 5 6 4 5 3 4 2 3 1 2 50 51 4...
result:
ok Correct! Used 98170 swaps
Test #8:
score: 0
Accepted
time: 1ms
memory: 3624kb
input:
1 50 10 15 52 42 32 47 29 31 51 12 48 43 19 14 2 28 39 51 10 43 36 33 6 29 11 4 18 12 41 15 34 24 2 48 30 25 23 34 17 9 28 24 8 17 4 21 14 42 19 48 30 23 16 30 9 33 25 33 36 21 12 36 18 46 35 31 13 44 34 15 50 34 11 33 38 9 23 9 42 4 3 37 12 2 41 7 34 23 16 10 27 24 8 38 16 24 11 47 29 3 50 34 52 47...
output:
NIE
result:
ok Correct! Used 0 swaps