13届重庆算法赛(L题)
题集导航:https://codeforces.com/gym/105887
`
define int long long
using namespace std;
int res = 0; int idx = 0;
int usenum[400100];
int copynum[400100];
const int MOD = 998244353;
signed main() {
int n; cin >> n; int nbf = n;
while (n--) {
string s; cin >> s;
if (s == "Push") {
int x; cin >> x;
res = (res + x) % MOD;
usenum[idx++] = x;
copynum[idx - 1] = x;
cout << res << endl;
}
else if (s == "Pop") {
idx--;
res = ((res - usenum[idx]) % MOD+MOD)%MOD;
cout << res << endl;
}
else {
res = res * 2 % MOD;
if (idx < nbf) {
for (int i = idx; i < idx * 2; i++) {
usenum[i] = copynum[i - idx];
copynum[i] = usenum[i];
}
idx = idx * 2;
}
cout << res << endl;
}
}
return 0;
}`
debug过程
第一次debug:在res=2的那个部分中,把copynum的数据复制进了usenum,但是使用的是i,后续忘记把idx的序数更新成复制后序数了,导致idx指向位置没有双倍,改后测试点只过了一个
第二次debug:修改了减法取模问题,原来是res = (res - usenum[idx]) % MOD;,改成res = ((res - usenum[idx]) % MOD+MOD)%MOD;即强制MOD取正,改后测试点过到七个,第七个RE了
第三次debug:既然是RE,考虑是超出边界范围。进行剪枝,因为一共只有n个操作,所以当数组复制双倍后超过n个数时,实际上头部的数字不会有机会被‘Pop’到,毕竟最多只可能Pop出n个数。所以,超过n时,头部数字可以考虑剪枝操作,其中可能超边界只会在idx2的部分有,前面一个个加或减很难超界,所以在此处加约束

浙公网安备 33010602011771号