codeforces 1244F.Chips

题目链接:http://codeforces.com/problemset/problem/1244/F

题目大意:有一个黑球和白球串起来的环,如果当前位置是白球,且它的左边一个和右边一个是黑球,那么下一秒这个球变成黑球。白球也是同样的规则,问经过k次之后的状态。

思路:可以发现如果有两个相同的球相连的话,那么就颜色永远不变并且每秒都会往外扩张。每次只要比较黑球和白球谁先扩张到或者都没扩张到的话就根据k的奇偶性判断。

代码:

#include<bits/stdc++.h>
using namespace std;
int vis[200010];
set<int>s1,s2;
set<int>::iterator it,it1,itt,itt1;
int main()
{
    int n,k,i;
    string s;
    cin>>n>>k;
    cin>>s;
    for(i=0;i<n;i++)
    {
        if(i==0)
        {
            if(s[i]==s[n-1]||s[i]==s[i+1])
            {
                if(s[i]=='B')
                {
                    vis[i]=1;
                    s1.insert(i);
                    s1.insert(i+n);
                    s1.insert(i+2*n);
                }
                else
                {
                    vis[i]=2;
                    s2.insert(i);
                    s2.insert(i+n);
                    s2.insert(i+2*n);
                }
            }
        }
        else if(i==n-1)
        {
            if(s[i]==s[0]||s[i]==s[i-1])
            {
                if(s[i]=='B')
                {
                    vis[i]=1;
                    s1.insert(i);
                    s1.insert(i+n);
                    s1.insert(i+2*n);
                }
                else
                {
                    vis[i]=2;
                    s2.insert(i);
                    s2.insert(i+n);
                    s2.insert(i+2*n);
                }

            }
        }
        else
        {
            if(s[i]==s[i-1]||s[i]==s[i+1])
            {
                if(s[i]=='B')
                {
                    vis[i]=1;
                    s1.insert(i);
                    s1.insert(i+n);
                    s1.insert(i+2*n);
                }
                else
                {
                    vis[i]=2;
                    s2.insert(i);
                    s2.insert(i+n);
                    s2.insert(i+2*n);
                }
            }
        }
    }
    for(i=0;i<n;i++)
    {
        if(vis[i]!=0)cout<<s[i];
        else
        {
            int c=1e9,cc=1e9;
            if(!s1.empty())
            {
                it=s1.upper_bound(i+n);
                it1=it;it--;
                if(abs(i-*it+n)<=k)c=min(c,abs(i-*it+n));
                if(abs(i-*it1+n)<=k)c=min(c,abs(i-*it1+n));
            }
            if(!s2.empty())
            {
                itt=s2.upper_bound(i+n);
                itt1=itt;itt--;
                if(abs(i-*itt+n)<=k)cc=min(cc,abs(i-*itt+n));
                if(abs(i-*itt1+n)<=k)cc=min(cc,abs(i-*itt1+n));
            }
            if(c==1e9&&cc==1e9)
            {

                if(k%2==0)
                {
                    if(s[i]=='W')cout<<'W';
                    else cout<<'B';
                }
                else
                {
                    if(s[i]=='W')cout<<'B';
                    else cout<<'W';
                }

            }
            else if(cc==1e9)
            {
                cout<<'B';
            }
            else if(c==1e9)
            {
                cout<<'W';
            }
            else
            {
                if(c>cc)cout<<'W';
                else cout<<'B';
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值