Codeforces 1244F Chips

题意

一个项链,每个珠子黑色或者白色,每一时刻,颜色发生变化
只考虑自己和左右相邻的3个珠子,若黑色多,则自己变为黑色,否则变为白色
问k时刻后珠子的颜色

题解

找规律
首先可以发现,连续的2个及以上相同的颜色的,是永远不会变化的
发现,会变化的只用形如 0101010101 的片段
而且,下一时刻,颜色会取反
操作数次会发现,会变化的区间每次向内缩减,即左右边界缩减1,那么,每个珠子的变化次数就知道了,最后的颜色也就知道了。

代码
#include<bits/stdc++.h>
#define N 200010
#define INF 0x3f3f3f3f
#define eps 1e-5
#define pi 3.141592653589793
#define mod 998244353
#define P 1000000007
#define LL long long
#define pb push_back
#define fi first
#define se second
#define cl clear
#define si size
#define lb lower_bound
#define ub upper_bound
#define bug(x) cerr<<#x<<"      :   "<<x<<endl
#define mem(x,y) memset(x,0,sizeof(int)*(y+3))
#define sc(x) scanf("%d",&x)
#define scc(x,y) scanf("%d%d",&x,&y)
#define sccc(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;
typedef  pair<int,int> pp;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#include <ext/pb_ds/priority_queue.hpp>
using namespace __gnu_pbds;
 
int f[N],a[N],l[N],r[N];
char ch[N];
 
int main(int argc, char const *argv[])
{
    int n,m;
    scc(n,m);
    cin>>ch+1;
    for(int i=1;i<=n;i++) a[i]=(ch[i]=='B');
    a[0]=a[n]; a[n+1]=a[1];
    for(int i=0;i<=n;i++) if (a[i]==a[i+1]) f[i]=f[i+1]=1;
 	memset(l,INF,sizeof l);memset(r,INF,sizeof r);
    for(int i=1;i<=n;i++) if (f[i]){
        for(int j=1;j<n&&!f[(i-j+n-1)%n+1];j++) r[(i-j+n-1)%n+1]=j;
        
        for(int j=1;j<n&&!f[(i+j-1)%n+1];j++) l[(i+j-1)%n+1]=j;
    }
    for(int i=1;i<=n;i++) if(!f[i])
        a[i]^=(min(m,min(r[i],l[i]))&1);
 
    ch[n+1]=0;
    for(int i=1;i<=n;i++) ch[i]=(a[i]==0?'W':'B');
    cout<<ch+1;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值