求助两种交换方式的区别(悬关)
查看原帖
求助两种交换方式的区别(悬关)
483317
ATZdhjeb楼主2023/5/22 13:34

RT ,这道题中说 可能存在 l>rl > r ,此时需交换 ll , rr 。然后我就有如下两种实现方式:

  1. 在输入 ll , rr 时直接交换,代码:
cin >> op >> l >> r;
if (l > r) swap(l,r);
if (op == 0) update(1,1,n,l,r);
else cout << query(1,1,n,l,r) << endl;

然后就AC了。AC记录

  1. 在 update 和 query 两个函数里交换,代码:
void update(const int& u,const int& l,const int& r,const int& x,const int& y) {
if (x > y) update(u,l,r,y,x);
if (r - l + 1 == sum[u]) return;
if (l == r) {
    sum[u] = sqrt(sum[u]);
    return;
}
if (x <= (l + r) / 2) update(get_left(u),l,(l + r) / 2,x,y);
if (y > (l + r) / 2) update(get_right(u),(l + r) / 2 + 1,r,x,y);
push_up(u);
}

... ...

int query(const int& u,const int& l,const int& r,const int& x,const int& y) {
   if (x > y) return query(u,l,r,y,x);
   if (x <= l && r <= y) return sum[u];
   int ans = 0;
   if (x <= (l + r) / 2) ans += query(get_left(u),l,(l + r) / 2,x,y);
   if (y > (l + r) / 2) ans += query(get_right(u),(l + r) / 2 + 1,r,x,y);
   return ans;
}

然后就 WA50pts 了。WA记录

除交换 ll,rr 以外两次的代码完全相同。

所以这两种实现方式究竟有什么区别?/yiw

可能悬关1~2个

2023/5/22 13:34
加载中...