@[thliup](/user/1166079) 首先您数组和字符串开小了,都开到 100005 能 90。
by 冰糖鸽子 @ 2023-12-21 16:22:51
@[thliup](/user/1166079) 然后注意到向右/左数的时候,直接取模在数到第 $n$ 个小人的时候被认为数到了第 $0$ 个小人。
正确代码如下。
```cpp
#include<iostream>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<stdbool.h>
#include<stdio.h>
#include<cstring>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int a[100005][10] = { 0 },b[100013] = { 0 }, ans = 1; // 开大数组
string s[100005]; // 同上
for (int i = 1; i <= n; i++) {
cin >> b[i];
cin >> s[i];
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= 2; j++) {
cin >> a[i][j];
}
if (a[i][1] == 0 && b[ans] == 0 || a[i][1] == 1 && b[ans]==1) {
ans = (n + ans - a[i][2]); // 先不取模
}
else
ans = (ans + a[i][2]); // 先不取模
if(ans>n) ans-=n; // 可以自己模拟一下,可以发现这样是对的
}
cout << s[ans] << endl;
return 0;
}
```
by 冰糖鸽子 @ 2023-12-21 16:25:28
@[冰糖鸽子](/user/227728) 麻烦你了,请问一下,如果先取余,是哪里错了呢,谢谢你
by thliup @ 2023-12-22 20:06:32
@[thliup](/user/1166079) 额我觉得我说了 `直接取模在数到第 n 个小人的时候被认为数到了第 0 个小人。`
by 冰糖鸽子 @ 2023-12-22 20:09:01
@[冰糖鸽子](/user/227728) 我的问题
by thliup @ 2023-12-22 20:44:51