线段树写法 WA 50 pts 的可能
  • 板块P4868 Preprefix sum
  • 楼主FuncoF9油酱瓶
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/5 21:46
  • 上次更新2023/11/2 15:23:28
查看原帖
线段树写法 WA 50 pts 的可能
550935
FuncoF9油酱瓶楼主2023/10/5 21:46

这个写法是像这样子的:

if (op[0] == 'M')
        {
            int k, x;
            cin >> k >> x;
            update(1, k, n, x - (query(1, k, k) - query(1, k - 1, k - 1)));
        }

而正确的见下:

if (op[0] == 'M')
        {
            int k, x;
            cin >> k >> x;
            int r;
            if (k - 1 <= 0) r = x - query(1, k, k);
            else r = x - (query(1, k, k) - query(1, k - 1, k - 1));
            update(1, k, n, r);
        }

原因:当 k - 1 = 0 时第一种会执行 query,然后如果恰好在这个函数里面也没有判断,就可能在一些奇奇怪怪的地方修改到这个 t[0] 的值,然后下次再查询到 query(1, k - 1, k - 1) 时就不是应该的 00,而是错误答案了。

所以在写一些数据结构(尤其递归结构,函数多的)一定要仔细检查有没有调用函数时参数越界之类的啊!!!

2023/10/5 21:46
加载中...