2020杭电多校 5C / HDU 6816 - Boring Game
作者:互联网
题意
将\(n\)张纸平铺在桌面上,一同从左向右折叠\(k\)次
给出一个长度为\(2*n*2^k\)的排列\(P\)
将纸张从上往下,正反交替标记为排列\(P\)中的值
问将纸张展开后得到的从上往下、从左往右的序列
思路
不会找规律,直接暴力就完事了
vector模拟将纸还原的过程(即最终状态为上图右半部分状态)
所以需要还原\(k\)次
每一次将当前合法的上半部分倒序合并到下半部分,如图
最后将还原出来的\(2n\)个vector倒序输出即可
代码
(312ms/1000ms)
#include<bits/stdc++.h>
using namespace std;
vector<int> v[555555];
void solve()
{
int n,k,m,d,cur;
cin>>n>>k;
m=n<<(k+1);
for(int i=1;i<=m;i++)
{
cin>>d;
v[i].clear();
v[i].push_back(d);
}
cur=1;
for(int t=1;t<=k;t++)
{
int mid=(cur+m)>>1;
for(int i=cur;i<=mid;i++)
{
int siz=v[i].size();
for(int j=siz-1;j>=0;j--) //从后往前加入下方vector内
v[mid+mid-i+1].push_back(v[i][j]);
}
cur=mid+1;
}
for(int i=m-n*2+1;i<=m;i++)
{
int siz=v[i].size();
for(int j=siz-1;j>=0;j--) //从后往前输出
cout<<v[i][j]<<(i==m&&j==0?'\n':' ');
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int T;cin>>T;
while(T--)
solve();
return 0;
}
标签:杭电多校,HDU,cur,int,Boring,mid,--,vector,倒序 来源: https://www.cnblogs.com/stelayuri/p/13435346.html