40pts TLE
查看原帖
40pts TLE
1413101
RN_GH楼主2025/7/29 14:59

实在不会优化了,有没有巨佬告诉我还有哪里可以优化的


#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5 + 5;

vector<int> child[MAXN];
int parent[MAXN];
int in[MAXN], out[MAXN], dfscnt = 0;
bool installed[MAXN];
bool vis[MAXN];

struct SegTree {
	vector<int> sum, lazy;
	int n;

	void init(int nn) {
		n = nn;
		sum.resize(4 * n);
		lazy.resize(4 * n, -1);
	}

	void pushdown(int p, int l, int r) {
		if (lazy[p] == -1) return;
		int m = (l + r) / 2;
		sum[p * 2] = (m - l + 1) * lazy[p];
		sum[p * 2 + 1] = (r - m) * lazy[p];
		lazy[p * 2] = lazy[p * 2 + 1] = lazy[p];
		lazy[p] = -1;
	}

	void update(int p, int l, int r, int ql, int qr, int val) {
		if (qr < l || ql > r) return;
		if (ql <= l && r <= qr) {
			sum[p] = (r - l + 1) * val;
			lazy[p] = val;
			return;
		}
		pushdown(p, l, r);
		int m = (l + r) / 2;
		update(p * 2, l, m, ql, qr, val);
		update(p * 2 + 1, m + 1, r, ql, qr, val);
		sum[p] = sum[p * 2] + sum[p * 2 + 1];
	}

	int query(int p, int l, int r, int ql, int qr) {
		if (qr < l || ql > r) return 0;
		if (ql <= l && r <= qr) return sum[p];
		pushdown(p, l, r);
		int m = (l + r) / 2;
		return query(p * 2, l, m, ql, qr) + query(p * 2 + 1, m + 1, r, ql, qr);
	}
} st;

void dfs(int u) {
	in[u] = ++dfscnt;
	for (int v : child[u]) {
		dfs(v);
	}
	out[u] = dfscnt;
}

void clear_mark(int x) {
	queue<int> q;
	q.push(x);
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		vis[u] = false;
		for (int v : child[u]) {
			q.push(v);
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
    cout.tie(0);

	int n;
	cin >> n;
	st.init(n);
	parent[0] = -1;

	for (int i = 1; i < n; i++) {
		cin >> parent[i];
		child[parent[i]].push_back(i);
	}

	dfs(0);

	int q;
	cin >> q;
	while (q--) {
		string op;
		int x;
		cin >> op >> x;
		if (op == "install") {
			int cnt = 0;
			vector<int> path;
			while (x != -1 && !vis[x]) {
				path.push_back(x);
				vis[x] = true;
				x = parent[x];
			}
			for (int node : path) {
				if (st.query(1, 1, n, in[node], in[node]) == 0) {
					cnt++;
					st.update(1, 1, n, in[node], in[node], 1);
				}
			}
			cout << cnt << '\n';
		} else {
			int cnt = st.query(1, 1, n, in[x], out[x]);
			if (cnt > 0) {
				st.update(1, 1, n, in[x], out[x], 0);
				clear_mark(x);
			}
			cout << cnt << '\n';
		}
	}
	return 0;
}
2025/7/29 14:59
加载中...