YACS 2023年5月月赛 乙组 T2 集体舞 题解

发布时间 2023-05-21 13:58:18作者: Xy_top

令 $loc[i]$ 为 $i$ 的位置,我们看看经过操作后会变成什么。

初始时 $loc[i] = i$。如果有 $r$ 操作,那么 $loc[i] ++$,如果是 $f$ 操作,那么 $loc[i]$ 变为 $n-loc[i]+1$ 即可。

最终的每个 $loc[i]$ 都可以表示为 $sign1$ $\times n + sign2 * i+extra$,$sign$ 要么是 $1$,要么是 $-1$

对于 $r$ 操作,仅需把 $extra$ 加一。

对于 $f$ 操作,不难发现变成 $n-sign1\times n-sign2 \times i-extra + 1$,化简为 $(1-sign1)\times n+(-sign2)\times i+(1-extra)$,不言而喻了吧。

所以我们只需要维护几个 tag,时间复杂度 $O(n)$,另外注意用下 getchar,不然可能会 TLE。

 

#include <iostream>
using namespace std;
int n;
char o;
int usen, sign = 1, add;
int a[500005];
int main () {
    cin >> n;
    o = getchar ();
    o = getchar ();
    while (o != '\n') {
        if (o == 'r') ++ add;
        else {
            usen = !usen;
            sign = -sign;
            add = 1 - add;
        }
        o = getchar ();
    }
    for (int i = 1; i <= n; i ++) {
        int loc = (usen * n + sign * i + add);
        loc = (loc % n + n) % n;
        if (loc == 0) a[n] = i;
        else a[loc] = i;
    }
    for (int i = 1; i <= n; i ++) cout << a[i] << "\n";
    return 0;
}