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;
}

原文地址:https://www.cnblogs.com/LLTYYC/p/11675247.html

时间: 2024-10-08 14:47:05

Codeforces 1244F. Chips的相关文章

Codeforces 1244F Chips(环修改,思维题)

链接:https://codeforces.com/contest/1244/problem/F 题意:给出一个每个节点黑色或者白色的环,k次更新,每次更新将所有满足条件的节点颜色反转(同时进行),满足条件:该节点的相邻的2个节点颜色和它不同.求k次后各个节点的颜色. 题解:环的话,序列复制向左右分别扩展一倍数,最后看中间部分,可以发现,颜色相同的连续的节点不会发生变化,颜色不同的序列,直接暴力更新即可,复杂度O(n) #include <bits/stdc++.h> #define IO_r

Chips CodeForces - 333B

Chips CodeForces - 333B 题意:有一个n*n的棋盘,其中有m个格子被禁止.在游戏开始前要将一些芯片(?)放到四条边上(但不能是角上).游戏开始后,每次操作将每一个芯片移动到它四周四格中某一格,并且要用n-1次操作将所有的芯片移到与其初始位置相对的一条边上.在移动过程中,不能有任何芯片经过被禁止的格子,不能有任何多个芯片重叠,不能在一次操作中使两个芯片交换位置(在将两个芯片放在相对的两条边上相对的位置时,就会发生).问如果要求完成游戏,最多可以在棋盘上放几个芯片. 方法: 事

C - Game with Chips.Educational Codeforces Round 84 (Rated for Div. 2)

http://codeforces.com/contest/1327/problem/C 题意 给你一个图和一堆点,然后问你这一堆点和一堆目标点怎么才能到达这些目标点至少一次. 做法 其实题目已经给你提示了,上面说移动次数不大于2nm. 其实在2nm内就能把图上所有位置遍历一遍. 简单来说就是不管你脑洞开的有多大,没有用.该暴力还是得暴力. 先把最右上角的点移动到左下角,再按照s型移动到原始位置 就能保证所有点都经历过这个图上别的所有点了. 代码 #include <iostream> usi

Educational Codeforces Round 84 (Rated for Div. 2) C. Game with Chips(思维题)

Petya has a rectangular Board of size n×mn×m . Initially, kk chips are placed on the board, ii -th chip is located in the cell at the intersection of sxisxi -th row and syisyi -th column. In one action, Petya can move all the chips to the left, right

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多

Codeforces 124A - The number of positions

题目链接:http://codeforces.com/problemset/problem/124/A Petr stands in line of n people, but he doesn't know exactly which position he occupies. He can say that there are no less than a people standing in front of him and no more than b people standing b

Codeforces 841D Leha and another game about graph - 差分

Leha plays a computer game, where is on each level is given a connected graph with n vertices and m edges. Graph can contain multiple edges, but can not contain self loops. Each vertex has an integer di, which can be equal to 0, 1 or  - 1. To pass th

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接: http://codeforces.com/problemset/problem/506/A 题意: 给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石. 题解: 容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富. dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1]) dp[i+st

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store