题意:
给出 (n) 张叠在一起的纸,现在将其连续从左向右折叠 (k) 次,再从上到下标上序号,问展开后的序号是怎么样的。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6816
分析:
代码:
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=1e6+6;
vector<int>p[N];
int main()
{
int T,n,k;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
int num=2*n*(1<<k),x,tk=k;
for(int i=1;i<=num;i++)
{
p[i].clear();
scanf("%d",&x);
p[i].pb(x);
}
int s=1,t=num;
while(tk--)
{
t=(s+num)/2;//cout<<"s="<<s<<" t="<<t<<endl;
for(int i=s;i<=t;i++)//折叠区间
{//cout<<i<<" - "<<s+num-i<<endl;
for(int j=p[i].size()-1;j>=0;j--)
p[s+num-i].pb(p[i][j]);
p[i].clear();
}
s+=(t-s+1);
}
for(int i=t+1;i<=num;i++)
{
for(int j=p[i].size()-1;j>=0;j--)
printf("%d%c",p[i][j],(j==0&&i==num)?'
':' ');
}
}
return 0;
}