跪求大佬改代码
查看原帖
跪求大佬改代码
316494
jifei楼主2022/3/18 20:19

70分卡住了,后三组大数据不是输出一堆0就是只输出几个结果就没了

#include <iostream>
using namespace std;
typedef long long ll;
const int MAXN = 1005;
ll tree[4*MAXN], num[MAXN], n, m;
ll tag[4*MAXN];

void Build(int k, int l, int r) {
	if (l == r) {
		tree[k] = num[l];
		return;
	}
	int mid = (l + r) >> 1;
	Build(k << 1, l, mid);
	Build(k << 1 | 1, mid + 1, r);
	tree[k] = tree[k << 1] + tree[k << 1 | 1];
	/*
	if (k == 1) {
		cout << "建立的线段树为:";
		for (int i = 1; i <= 4 * n; i++) {
			cout << tree[i] << " ";
		}
		cout << endl;
	}*/
	
}

void Lazy_tag(int k, int l, int r, int x, int y, ll v) {//k->当前节点 l,r->当前节点表示区间 x,y->目标区间 v->修改值 
	if (l >= x && r <= y) { //如果当前区间完全包含需标记区间  
		tag[k] += (r - l + 1) * v; //标记当前节点 
		
		/*
		if (k == 1) {
			cout << "线段树上的标记为:";
			for (int i = 1; i <= 4 * n; i++) {
				cout << tag[i] << " ";
			}
			cout << endl;
		}
		*/
		
		return;
	}
	if (l > y || r < x) { //如果当前区间与目标区间完全不相关 
		return;
	}
	int mid = (l + r) >> 1; //二分两棵子树 
	Lazy_tag(k << 1, l, mid, x, y, v); //左子树 
	Lazy_tag(k << 1 | 1, mid + 1, r, x, y, v); //右子树 
	
	/*
	if (k == 1) {
		cout << "线段树上的标记为:";
		for (int i = 1; i <= 4 * n; i++) {
			cout << tag[i] << " ";
		}
		cout << endl;
	}
	*/
	
}

void Down(int k, int l, int r, ll num) {
	int mid = (l + r) >> 1;
	int a = mid - l + 1, b = r - mid;
	tag[k << 1] += num * a / (a + b);
	tag[k << 1 | 1] += num * b / (a + b); 
	tag[k] = 0;
	
	/*
	cout << "标记下传,更新后标记为:";
	for (int i = 1; i <= 4 * n; i++) {
		cout << tag[i] << " ";
	} 
	cout << endl;
	*/
	
}

ll Find(int k, int l, int r, int x, int y) {//k->当前节点 l,r->当前节点表示区间 x,y->标记区间
	
	if (l > y || r < x) {
		return 0;
	}
	if (tag[k] != 0) {
		tree[k] += tag[k];
		Down(k, l, r, tag[k]);
		//return tree[k];
	}
	if (l == r) {
		return tree[k];
	}
	int ans = 0;
	int mid = (l + r) >> 1;
	ans += Find(k << 1, l, mid, x, y);
	ans += Find(k << 1 | 1, mid + 1, r, x, y);
	tree[k] = tree[k << 1] + tree[k << 1 | 1];
	return ans;
}

int main() {
	ios::sync_with_stdio(false);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> num[i];
	}
	
	Build(1, 1, n);
	/*
	for (int i = 1; i <= n << 2; i++) {
		cout << tree[i] << " ";
	}
	
	Lazy_tag(1, 1, n, 1, 3, 1);
	for (int i = 1; i <= n << 2; i++) {
		cout << tag[i] << " ";
	}
	cout << endl;
	
	cout << Find(1, 1, n, 1, 3) << endl;
	for (int i = 1; i <= n << 2; i++) {
		cout << tree[i] << " ";
	}
	*/
	for (int i = 1; i <= m; i++) {
		int cmd;
		cin >> cmd;
		if (cmd == 1) {
			int x, y, k;
			cin >> x >> y >> k;
			Lazy_tag(1, 1, n, x, y, k);
		}
		else if (cmd == 2) {
			int x, y;
			cin >> x >> y;
			cout << Find(1, 1, n, x, y) << endl;
		}
	}
	return 0;
}
/*
5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
*/
2022/3/18 20:19
加载中...