码迷,mamicode.com
首页 > 其他好文 > 详细

【AtCoder】AGC011 D - Half Reflector

时间:2018-06-21 19:44:57      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:back   cond   name   int   ack   字符   方向   两种   algo   

题解

大意是n个管子排成一排,每个管子有两种状态,A状态是从某个方向进去,从原方向出来,B状态是从某个方向进去,从另一个方向出来
球经过一个A状态的管子这个管子会立刻变成B状态,经过一个B状态的管子会立刻变成A状态

往里面扔K个球,问最后管子的状态

我们发现如果第一个管子是A的话,球会立刻弹出去

否则的话
如果第二个管子是B
那么
A -> B
A A ->
如果第二个管子是A
A -> A
A <- B
B -> B
B A ->
也就是,每次操作后的状态只与右边第一个管子有关,并且最后一个管子一定是A
那么操作可以考虑成,删掉第一个字符,后面的字符全部取反,然后再最后填上一个A

然而有K次,我们发现起点移动N次之后就是循环了
如果N次之后是
BABABA...那么这个形态不会变

如果N次之后是
ABABAB...

那么之后的形态就是
BBABAB...
ABABAB...
这样的循环了

代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <cmath>
#include <bitset>
#include <queue>
#define enter putchar(‘\n‘)
#define space putchar(‘ ‘)
//#define ivorysi
#define pb push_back
#define mo 974711
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define MAXN 200005
#define eps 1e-12
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
    res = 0;char c = getchar();T f = 1;
    while(c < ‘0‘ || c > ‘9‘) {
    if(c == ‘-‘) f = -1;
    c = getchar();
    }
    while(c >= ‘0‘ && c <= ‘9‘) {
    res = res * 10 - ‘0‘ + c;
    c = getchar();
    }
    res = res * f;
}
template<class T>
void out(T x) {
    if(x < 0) {x = -x;putchar(‘-‘);}
    if(x >= 10) out(x / 10);
    putchar(‘0‘ + x % 10);
}
char s[MAXN];
int N,K,p = 1,num[MAXN],cnt,st;
void Solve() {
    read(N);read(K);
    scanf("%s",s + 1);
    for(int i = 1 ; i <= N ; ++i) num[i] = s[i] - ‘A‘;
    st = num[1];
    while(K--) {
    if(st == 0) {st ^= 1;num[p] ^= 1;}
    else {
        ++p;++cnt;
        st = num[p];
        st ^= (cnt & 1);
    }
    if(p > N) break;
    }
    if(p <= N) {
    for(int i = p ; i <= N ; ++i) putchar(‘A‘ + (num[i] ^ (cnt & 1)));
    int t = N - (N - p + 1),c = (cnt - 1) & 1;
    while(t--) {
        putchar(‘A‘ + c);
        c ^= 1;
    }
    }
    else {
    if((cnt - 1) & 1) {
        for(int i = 1 ; i <= N ; ++i) putchar(‘A‘ + (i & 1));
    }
    else {
        putchar(‘A‘ + (K & 1));
        for(int i = 1 ; i < N ; ++i) putchar(‘A‘ + (i & 1));
    }
    }
    enter;
}
int main() {
#ifdef ivorysi
    freopen("f1.in","r",stdin);
#endif
    Solve();
}

【AtCoder】AGC011 D - Half Reflector

标签:back   cond   name   int   ack   字符   方向   两种   algo   

原文地址:https://www.cnblogs.com/ivorysi/p/9210569.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!