萌新爆零求助
查看原帖
萌新爆零求助
306962
MVP_Harry楼主2020/8/31 06:27

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; 
}
2020/8/31 06:27
加载中...