用户登录
用户注册

分享至

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("");
    }

}

软件
前端设计
程序设计
Java相关