RT,本菜鸡采用的是类似于题解第二篇的解法,及区间最大值小于等于1时直接跳过。交上去,结果全部WA,但下载第一个点数据一点问题都没有...而且错误信息居然是"Answer too short on line 2".
码风还不错,有相应的注释,求大佬帮忙,谢谢!
//线段树代码
const int maxn = 1e5 + 5;
int N, Q;
ll a[maxn];
struct SegmentTree {
ll sum, maxx; //分别代表区间和以及区间最大值
} T[maxn << 2];
inline void pushup(int p) {
//pushup更新
T[p].maxx = max(T[p << 1].maxx, T[p << 1 | 1].maxx);
T[p].sum = T[p << 1].sum + T[p << 1 | 1].sum;
}
inline void build(int s, int t, int p) {
//建树
if (s == t) {
T[p].sum = T[p].maxx = a[s];
return ;
}
int mid = (s + t) >> 1;
build(s, mid, p << 1), build(mid + 1, t, p << 1 | 1);
pushup(p);
}
inline void update(int l, int r, int s, int t, int p) {
//暴力更新,当maxx <= 1时,直接跳过
if (s == t) {
T[p].sum = sqrt(T[p].sum);
T[p].maxx = sqrt(T[p].maxx);
return ;
}
int mid = (s + t) >> 1;
if (l <= mid && T[p << 1].maxx > 1) update(l, r, s, mid, p << 1);
if (r > mid && T[p << 1 | 1].maxx > 1) update(l, r, mid + 1, t, p << 1 | 1);
pushup(p);
}
ll query(int l, int r, int s, int t, int p) {
//求和
if (l <= s && r >= t) return T[p].sum;
int mid = (s + t) >> 1;
ll sum = 0;
if (l <= mid) sum += query(l, r, s, mid, p << 1);
if (r > mid) sum += query(l, r, mid + 1, t, p << 1 | 1);
return sum;
}
主函数:
int main() {
read(N); //快读,可以读long long
rep(i, 1, N) read(a[i]);
build(1, N, 1);
read(Q);
while (Q--) {
int opt, x, y;
read(opt), read(x), read(y);
if (x > y) swap(x, y);
if (opt) write(query(x, y, 1, N, 1)), puts("\n");
else update(x, y, 1, N, 1);
}
return 0;
}