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

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

#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;
bool installed[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;
}

int install(int x) {
    int cnt = 0;
    while(true) {
        if(st.query(1, 1, st.n, in[x], in[x]) == 0) {
            cnt++;
            st.update(1, 1, st.n, in[x], in[x], 1);
        }
        if(x == 0) break;
        x = parent[x];
    }
    return cnt;
}

int uninstall(int x) {
    int cnt = st.query(1, 1, st.n, in[x], out[x]);
    if(cnt > 0) {
        st.update(1, 1, st.n, in[x], out[x], 0);
    }
    return cnt;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    int n;
    cin >> n;
    st.init(n);
    
    for(int i = 1; i < n; i++) {
        cin >> parent[i];
        child[parent[i]].push_back(i);
    }
    
    dfscnt = 0;
    dfs(0);
    
    int q;
    cin >> q;
    while(q--) {
        string op;
        int x;
        cin >> op >> x;
        if(op == "install") {
            cout << install(x) << '\n';
        } else {
            cout << uninstall(x) << '\n';
        }
    }
    
    return 0;
}
2025/7/29 15:05
加载中...