线段树MLE求调
查看原帖
线段树MLE求调
1131293
yuinana楼主2024/10/2 19:14

如题,线段树M了十几发test35,换了树状数组后同数组大小过了,再调了几发还是M,终究道心破碎,挂个几个月看看有没有神救救。

#include<bits/stdc++.h>
//#define int long long
#define endl '\n'
#define pii pair<int, int>
using namespace std;
const int MAX = 5e5 + 8;
long long cnt[MAX << 2];
long long num[MAX];
vector<int> ed[MAX], to[MAX];
int fir[MAX];
int x[MAX];

//void build(int l, int r, int p) {
//	cnt[p] = 0;
//	if(l == r) {
//		return ;
//	}
//	int mid = l + r >> 1;
//	build(l, mid, p * 2);
//	build(mid + 1, r, p * 2 + 1);
//}
void fix(int l, int r, int s, int t, int p, int k) {
	if(s <= l && r <= t) {
		cnt[p] += k;
		return ;
	}
	int mid = l + r >> 1;
	if(s <= mid) fix(l, mid, s, t, p * 2, k);
	if(mid < t) fix(mid + 1, r, s, t, p * 2 + 1, k);
	cnt[p] = cnt[p * 2] + cnt[p * 2 + 1];
}
long long query(int l, int r, int s, int t, int p) {
	if(s <= l && r <= t) {
		return cnt[p];
	}
	long long mid = l + r >> 1, ans = 0;
	if(s <= mid) ans += query(l, mid, s, t, p * 2);
	if(mid < t) ans += query(mid + 1, r, s, t, p * 2 + 1);
	return ans;
}

int q;
void dfs(int now, int pre) {
	for(auto t : to[now]) {
		int w = x[t];
		fix(1, q, t, t, 1, w);
	}
	
	for(auto to : ed[now]) {
		if(to == pre) continue;
		dfs(to, now);
	}
	
	if(now == 1) num[now] = query(1, q, 1, q, 1);
	else num[now] = query(1, q, fir[now], q, 1);
	
	for(auto t : to[now]) {
		int w = x[t];
		fix(1, q, t, t, 1, -w);
	}
}

void run() {
	cin >> q;
//	build(1, q, 1);
	for(int i = 1; i <= q; i++) {
		ed[i].clear();
		to[i].clear();
//		num[i] = fir[i] = 0;
	}
	
	int sz = 1;
	for(int i = 1; i <= q; i++) {
		int op, u;
		cin >> op >> u;
		if(op == 1) {
			sz++;
			fir[sz] = i;
			ed[u].push_back(sz);
		}
		else {
			int p;
			cin >> p;
			to[u].push_back(i);
			x[i] = p;
		}
	}

	dfs(1, 0);
	for(int i = 1; i <= sz; i++) {
		cout << num[i] << ' ';
	}
	cout << endl;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t = 1;
	cin >> t;
	while(t--) {
		run();
	}
	return 0;
}
2024/10/2 19:14
加载中...