2020多校第五场Boring Game
- 作者: 魓魖魒魎鬾魕
- 来源: 51数据库
- 2021-07-12
思路
对于每次展开,挑选当前最中间的位置作为 mid ,将上半段翻转一下贴到下半段的左边,直接用 vector 暴力维护整个过程。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>
#define ll long long
using namespace std;
const int maxn=6e6+6;
const int N = 1e6+5;
const ll mod=998244353;
const ll MOD=998244353;
ll power(ll x,ll a)
{
ll ans=1;
while(a)
{
if(a&1)
{
ans=ans*x%mod;
}
x=x*x%mod;
a>>=1;
}
return ans;
}
ll a,b,ans;
char optr;
int base;
bool isop(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='=')
return 1;
else
return 0;
}
int getn(char c)
{
if(c>='A')
return c-'A'+10;
else
return c-'0';
}
void fun(string s)
{
a=0;
b=0;
ans=0;
int i;
for(i=0; !isop(s[i]); i++)
{
a*=base;
a+=getn(s[i]);
}
optr=s[i];
for(i++; s[i]!='='; i++)
{
b*=base;
b+=getn(s[i]);
}
for(i++; i<s.size(); i++)
{
//cout<<getn(s[i])<<' ';
ans*=base;
ans+=getn(s[i]);
}
}
vector<int>node[N];
int main()
{
#ifndef ONLINE_JUDGE
// freopen("data.in.txt","r",stdin);
// freopen("data.out.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);
int w;
cin>>w;
while(w--)
{
int n,k;
scanf("%d%d",&n,&k);
int limit=2*n*(1<<k);
for(int i=1; i<=limit; i++)
node[i].clear();
for(int i=1; i<=limit; i++)
{
int num;
scanf("%d",&num);
node[i].push_back(num);
}
int mid=1;
while(k--)
{
mid=mid+limit>>1;
for(int j=mid+1; j<=limit; j++)
{
int pos=mid-(j-(mid+1));
reverse(node[pos].begin(),node[pos].end());
node[j].insert(node[j].begin(),node[pos].begin(),node[pos].end());
node[pos].clear();
}
}
bool first=true;
for(int i=limit-2*n+1; i<=limit; i++)
for(int j=0; j<node[i].size(); j++)
{
if(first)
first=false;
else
putchar(' ');
printf("%d",node[i][j]);
}
puts("");
}
}
推荐阅读