Submission #625707

# Submission time Handle Problem Language Result Execution time Memory
625707 2022-08-10T17:22:22 Z Soul234 Tree Rotations (POI11_rot) C++14
100 / 100
112 ms 17604 KB
#include<bits/stdc++.h>
using namespace std;

void DBG() { cerr << "]\n"; }
template<class H, class... T> void DBG(H h, T... t) {
    cerr << h; if(sizeof...(t)) cerr << ", ";
    DBG(t...);
}
#ifdef LOCAL
#define dbg(...) cerr << "[" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__)
#else
#define dbg(...) 0
#endif // LOCAL

#define FOR(i,a,b) for(int i = (a) ; i<(b) ; i++)
#define F0R(i,a) FOR(i,0,a)
#define ROF(i,a,b) for(int i = (b)-1 ; i>=(a) ; i--)
#define R0F(i,a) ROF(i,0,a)
#define each(e,a) for(auto &e : (a))
#define sz(v) (int)(v).size()
#define all(v) (v).begin(),(v).end()
#define rall(v) (v).rbegin(),(v).rend()
#define pb push_back
#define tcT template<class T
#define nl "\n"

using ll = long long;
using vi = vector<int>;
using pi = pair<int,int>;
using str = string;
tcT> using V = vector<T>;
tcT> using pqg = priority_queue<T,vector<T>,greater<T>>;

void setIO(string NAME = "") {
    cin.tie(0)->sync_with_stdio(0);
    if(sz(NAME)) {
        freopen((NAME + ".inp").c_str(),"r",stdin);
        freopen((NAME + ".out").c_str(),"w",stdout);
    }
}

tcT> bool ckmin(T&a, const T&b) {
    return b < a ? a=b,1 : 0; }
tcT> bool ckmax(T&a, const T&b) {
    return b > a ? a=b,1 : 0; }

struct BIT {
    int N; vi bit;
    void init(int _N) {
        N = _N;
        bit.assign(N + 7, 0);
    }
    void upd(int p, int val) {
        for(; p<=N; p += p&-p) bit[p] += val;
    }
    int query(int r) {
        int res = 0;
        for(; r>0; r -= r&-r) res += bit[r];
        return res;
    }
} fen;

const int MOD = 1e9 + 7;

const int MX = 2e5+5;
int N, numNod, adj[2*MX][2], tin[2*MX], tout[2*MX], tt, val[2*MX];
ll ans = 0;

int inputTree() {
    int u = ++numNod, cur;
    cin >> cur;
    if(!cur) {
        adj[u][0] = inputTree();
        tin[u] = tin[adj[u][0]];
        adj[u][1] = inputTree();
    }
    else {
        val[tin[u] = tt++] = cur;
    }
    tout[u] = tt;
    return u;
}

void dfs(int u, bool toKeep) {
    if(!adj[u][0]) {
        if(toKeep) fen.upd(val[tin[u]], 1);
        return;
    }
    int x = adj[u][0], y = adj[u][1];
    if(tout[x] - tin[x] > tout[y] - tin[y])
        swap(x, y);
    dfs(x, 0); dfs(y, 1); ll cntInv = 0;
    FOR(p, tin[x], tout[x]) {
        cntInv += fen.query(val[p]-1);
    }
    ans += min(cntInv, 1LL*(tout[x] - tin[x])*(tout[y] - tin[y]) - cntInv);
    if(toKeep) {
        FOR(p, tin[x], tout[x]) fen.upd(val[p], 1);
    }
    else {
        FOR(p, tin[y], tout[y]) fen.upd(val[p], -1);
    }
}

void solve() {
    cin >> N;
    fen.init(N + 5);
    inputTree();
    dfs(1, 1);
    cout << ans << nl;
}

int main() {
    setIO();

    int t=1;
    //cin>>t;
    while(t-->0) {
        solve();
    }

    return 0;
}

Compilation message

rot.cpp: In function 'void setIO(std::string)':
rot.cpp:37:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   37 |         freopen((NAME + ".inp").c_str(),"r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rot.cpp:38:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   38 |         freopen((NAME + ".out").c_str(),"w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 328 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 724 KB Output is correct
2 Correct 3 ms 472 KB Output is correct
3 Correct 3 ms 724 KB Output is correct
4 Correct 1 ms 724 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 1604 KB Output is correct
2 Correct 8 ms 852 KB Output is correct
3 Correct 14 ms 1748 KB Output is correct
4 Correct 5 ms 1492 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 27 ms 2720 KB Output is correct
2 Correct 18 ms 3916 KB Output is correct
3 Correct 24 ms 5312 KB Output is correct
4 Correct 21 ms 5292 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 9976 KB Output is correct
2 Correct 25 ms 7496 KB Output is correct
3 Correct 29 ms 5844 KB Output is correct
4 Correct 32 ms 4732 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 35 ms 6056 KB Output is correct
2 Correct 33 ms 7428 KB Output is correct
3 Correct 48 ms 10360 KB Output is correct
4 Correct 36 ms 10156 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 112 ms 11536 KB Output is correct
2 Correct 73 ms 10148 KB Output is correct
3 Correct 76 ms 10296 KB Output is correct
4 Correct 70 ms 9444 KB Output is correct
5 Correct 99 ms 8332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 74 ms 10360 KB Output is correct
2 Correct 70 ms 15928 KB Output is correct
3 Correct 100 ms 14012 KB Output is correct
4 Correct 63 ms 16924 KB Output is correct
5 Correct 111 ms 9548 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 77 ms 10076 KB Output is correct
2 Correct 80 ms 11756 KB Output is correct
3 Correct 109 ms 9848 KB Output is correct
4 Correct 81 ms 10220 KB Output is correct
5 Correct 79 ms 17604 KB Output is correct
6 Correct 108 ms 9804 KB Output is correct