• Codeforces 1244F. Chips


    传送门

    显然可以注意到连续的两个相同颜色的位置颜色是不会改变的,并且它还会把自己的颜色每秒往外扩展一个位置

    同时对于 $BWBWBW...$ 这样的序列,它每个位置的颜色每一秒变化一次

    然后可以发现,对于一个位置 $x$,在 $x$ 左边和右边 连续两个相同颜色 扩展到 $x$ 之前, $x$ 的颜色一定是每秒变化一次

    考虑每个位置 $x$ 第 $k$ 秒时的颜色,如果 $x$ 初始往 左或者往右的连续两个相同颜色 扩展到 $x$ 的时间都大于 $k$ ,那么我们可以通过 $k$ 的奇偶性和 $x$ 的初始颜色 求出最终的颜色

    如果 $x$ 初始往左或者往右的 连续两个相同颜色 扩展到 $x$ 的时间小于 $k$ ,那么需要时间比较小的那边就会先把 $x$ 同化

    所以我们可以通过预处理出每个位置往左和往右第一个 连续两个相同颜色 来判断每个位置最终的颜色

    实现看代码吧

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<vector>
    using namespace std;
    typedef long long ll;
    inline int read()
    {
        int x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*f;
    }
    const int N=2e5+7;
    int n,m,L[N],R[N];
    char s[N],ans[N];
    vector <int> pos;
    bool vis[N];
    int main()
    {
        n=read(),m=read();
        scanf("%s",s+1);
        for(int i=1;i<=n;i++)
        {
            int l=(i+n-2)%n+1,r=i%n+1;
            if(s[l]==s[i]||s[r]==s[i]) pos.push_back(i),vis[i]=1;
        }
        int len=pos.size();
        if(!len)
        {
            for(int i=1;i<=n;i++)
                ans[i]= (s[i]=='W' ^ (m&1)) ? 'W' : 'B';
            for(int i=1;i<=n;i++) printf("%c",ans[i]); puts("");
            return 0;
        }
        int las=pos[len-1];
        for(int i=1;i<=n;i++)
            if(vis[i]) las=i;
            else L[i]=las;
        las=pos[1];
        for(int i=n;i>=1;i--)
            if(vis[i]) las=i;
            else R[i]=las;
        for(int i=1;i<=n;i++)
        {
            if(vis[i]) { ans[i]=s[i]; continue; }
            int Ld=(i-L[i]+n)%n,Rd=(R[i]-i+n)%n;
            if(min(Ld,Rd)>m)
                ans[i]= (s[i]=='W' ^ (m&1)) ? 'W' : 'B';
            else
                ans[i]= (Ld<Rd) ? s[L[i]] : s[R[i]];
        }
        for(int i=1;i<=n;i++) printf("%c",ans[i]); puts("");
        return 0;
    }
  • 相关阅读:
    微信小程序设置web-view的业务域名
    第61节:Java中的DOM和Javascript技术
    第61节:Java中的DOM和Javascript技术
    小程序获取时间格式
    小程序获取时间格式
    小程序弹出框详解
    小程序弹出框详解
    Python自定义包引入【新手必学】
    Go语言底层知识总结【新手必学】
    Python代码编写规范,你真的会吗?
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/11675247.html
Copyright © 2020-2023  润新知