Submission #1105887

# Submission time Handle Problem Language Result Execution time Memory
1105887 2024-10-28T08:39:52 Z trandangquang Tree Rotations (POI11_rot) C++14
63 / 100
162 ms 43080 KB
#include <bits/stdc++.h>

#define FOR(i, a, b) for(int i = (a); i <= (b); ++i)
#define FORD(i, a, b) for(int i = (a); i >= (b); --i)
#define ii pair <int, int>
#define fi first
#define se second
#define eb emplace_back
#define sz(a) (int)(a).size()
#define all(a) (a).begin(), (a).end()

using namespace std;

const int mxN = 5e5+5;
const int mxL = 2e5+5;

int n, val[mxN], sub[mxN], tin[mxN], tout[mxN], tour[mxN], Time, cur, ans;
vector <int> valN[mxN], ch[mxN];

int newNode() {
    return ++cur;
}

struct fenwickTree {
    int f[mxL];
    void upd(int id, int val) {
        for(; id<mxL; id+=id&-id) f[id]+=val;
    }
    int get(int id) {
        int res = 0;
        for(; id>0; id-=id&-id) res+=f[id];
        return res;
    }
} fwt;

struct reverseFenwickTree {
    int f[mxL];
    void upd(int id, int val) {
        for(; id>0; id-=id&-id) f[id]+=val;
    }
    int get(int id) {
        int res = 0;
        for(; id<mxL; id+=id&-id) res+=f[id];
        return res;
    }
} rfwt;

void input(int node) {
    int x; cin >> x;

    if(x == 0) {
        int lfN = newNode();
        input(lfN);
        int rtN = newNode();
        input(rtN);

        ch[node].eb(lfN);
        ch[node].eb(rtN);
    }
    else {
        val[node] = x;
    }
}

void pre_dfs(int u) {
    tin[u] = ++Time;
    tour[Time] = u;

    sub[u] = 1;
    for(int v:ch[u]) {
        pre_dfs(v);
        sub[u] += sub[v];
    }

    tout[u] = Time;
}

void dfs(int u) {
    int bigCh = -1;
    for(int v:ch[u]) if(bigCh == -1 || sub[v]>sub[bigCh]) bigCh=v;
    for(int v:ch[u]) if(v != bigCh) {
        dfs(v);
        FOR(i,tin[v],tout[v]){
            if(val[tour[i]]) {
                fwt.upd(val[tour[i]], -1);
                rfwt.upd(val[tour[i]], -1);
            }
        }
    }
    if(bigCh != -1) dfs(bigCh);

    /// main solve
    int res=0, rres=0;

    for(int v:ch[u]) if(v != bigCh) {
        FOR(i,tin[v],tout[v]){
            if(val[tour[i]]) {
                res+=fwt.get(val[tour[i]]-1);
                rres+=rfwt.get(val[tour[i]]+1);
            }
        }
        FOR(i,tin[v],tout[v]){
            if(val[tour[i]]) {
                fwt.upd(val[tour[i]], 1);
                rfwt.upd(val[tour[i]], 1);
            }
        }
    }

    ans += min(res, rres);
    if(val[u]) {
        fwt.upd(val[u], 1);
        rfwt.upd(val[u], 1);
    }
}

int main() {
    if(fopen("test.inp", "r")) {
        freopen("test.inp", "r", stdin);
        freopen("test.out", "w", stdout);
    }
    cin.tie(0)->sync_with_stdio(0);

    cin >> n;
    cur = 1; input(1);
    pre_dfs(1);
    dfs(1);
    cout << ans;
}

Compilation message

rot.cpp: In function 'int main()':
rot.cpp:119:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  119 |         freopen("test.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
rot.cpp:120:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  120 |         freopen("test.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 6 ms 33104 KB Output is correct
2 Correct 6 ms 33104 KB Output is correct
3 Correct 6 ms 33268 KB Output is correct
4 Correct 5 ms 33104 KB Output is correct
5 Correct 5 ms 33104 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 7 ms 33104 KB Output is correct
2 Correct 5 ms 33256 KB Output is correct
3 Correct 5 ms 33104 KB Output is correct
4 Correct 5 ms 33232 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 33104 KB Output is correct
2 Correct 5 ms 33152 KB Output is correct
3 Correct 6 ms 33104 KB Output is correct
4 Correct 5 ms 33360 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 33616 KB Output is correct
2 Correct 7 ms 33448 KB Output is correct
3 Correct 6 ms 33616 KB Output is correct
4 Correct 6 ms 33508 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 34384 KB Output is correct
2 Correct 13 ms 33744 KB Output is correct
3 Correct 32 ms 34384 KB Output is correct
4 Correct 12 ms 34128 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 44 ms 35152 KB Output is correct
2 Correct 30 ms 36688 KB Output is correct
3 Correct 33 ms 37968 KB Output is correct
4 Correct 43 ms 37816 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 36 ms 42680 KB Output is correct
2 Correct 44 ms 39904 KB Output is correct
3 Correct 56 ms 38172 KB Output is correct
4 Correct 41 ms 37100 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 62 ms 38252 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 162 ms 43080 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 101 ms 42056 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 122 ms 42136 KB Output isn't correct
2 Halted 0 ms 0 KB -