2020杭电多校 5C / HDU 6816 - Boring Game

HDU 6816 - Boring Game


题意

\(n\)张纸平铺在桌面上,一同从左向右折叠\(k\)

给出一个长度为\(2*n*2^k\)的排列\(P\)

将纸张从上往下,正反交替标记为排列\(P\)中的值

问将纸张展开后得到的从上往下、从左往右的序列

PIC




思路

不会找规律,直接暴力就完事了

vector模拟将纸还原的过程(即最终状态为上图右半部分状态)

所以需要还原\(k\)

每一次将当前合法的上半部分倒序合并到下半部分,如图

PIC2

最后将还原出来的\(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;
}

posted @ 2020-08-04 19:28  StelaYuri  阅读(356)  评论(0编辑  收藏  举报