RT ,这道题中说 可能存在 l>r ,此时需交换 l , r 。然后我就有如下两种实现方式:
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记录
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记录
除交换 l,r 以外两次的代码完全相同。
所以这两种实现方式究竟有什么区别?/yiw
可能悬关1~2个