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