题目链接: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';
}
}
}
}