Submission #1020431

#TimeUsernameProblemLanguageResultExecution timeMemory
1020431nathan4690Untitled (POI11_rot)C++17
100 / 100
317 ms44368 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define ll long long #define pll ll #define ld long double #define el cout << '\n' #define f1(i,n) for(ll i=1;i<=n;i++) #define __file_name "" using namespace std; using namespace __gnu_pbds; #define ordered_set tree<pll, null_type, less<pll>, rb_tree_tag, tree_order_statistics_node_update> using namespace std; const ll maxn = 4e5+5, inf=1e18; /* // Be yeu tle roi cay qua ll dfs(ll u, ll p){ if(a[u]){ // cout << u << ' ' << a[u];el; values[u].insert(a[u]); return 0; } ll resp = 0; ll le = 0, ri = 0; for(ll c: G[u]){ if(c != p){ resp += dfs(c, u); if(le == 0) le = c; else ri = c; } } if(values[ri].size() < values[le].size()) swap(values[ri], values[le]); // le < ri ll res1 = 0, res2 = 0; // res1: count inversion if le comes before ri // res2: count inversions if le comes after ri for(auto item: values[le]){ res1 += values[ri].order_of_key(item); res2 += values[ri].size() - values[ri].order_of_key(item+1); } // cout << u << ' ' << res1 << ' ' << res2;el; for(ll c: G[u]){ if(c != p){ if(values[c].size() > values[u].size()) values[u].swap(values[c]); for(auto item: values[c]){ values[u].insert(item); } values[c].clear(); } } return resp + min(res1, res2); } */ ll n,a[maxn],sz[maxn]; pair<ll,ll> bit[maxn]; vector<ll> G[maxn]; vector<ll> sus; void update(ll idx, pair<ll,ll> v){ while(idx <= n){ bit[idx].first += v.first; bit[idx].second += v.second; idx += idx & (-idx); } } pair<ll,ll> getSum(ll idx){ // {sum, count} pair<ll,ll> res = {0ll, 0ll}; while(idx > 0){ res.first += bit[idx].first; res.second += bit[idx].second; idx -= idx & (-idx); } return res; } void dfs_size(ll u, ll p){ sz[u] = 1; for(ll c: G[u]){ if(c != p){ dfs_size(c, u); sz[u] += sz[c]; } } } void delete_(ll u, ll p){ if(a[u]){ update(a[u], {-1ll, -1ll}); return; } for(ll c: G[u]){ if(c != p){ delete_(c, u); } } } void add_(ll u, ll p){ if(a[u]){ update(a[u], {1ll , 1ll}); return; } // update(order[u], {c[u], 1ll}); for(ll c: G[u]){ if(c != p){ add_(c, u); } } } ll dfslow(ll u, ll p){ if(a[u]){ return getSum(a[u] - 1).first; } ll res = 0; for(ll c: G[u]){ if(c != p){ res += dfslow(c, u); } } return res; } ll dfshigh(ll u, ll p){ if(a[u]){ return getSum(n).first - getSum(a[u]).first; } ll res = 0; for(ll c: G[u]){ if(c != p){ res += dfshigh(c, u); } } return res; } ll dfs(ll u, ll p){ ll msz = -1, v0 = 0; for(ll c: G[u]){ if(c != p){ if(sz[c] > msz){ msz = sz[c]; v0 = c; } } } if(msz == -1){ update(a[u], {1ll , 1ll}); return 0; } ll res = 0; for(ll c: G[u]){ if(c != p && c != v0){ res += dfs(c, u); delete_(c, u); } } res += dfs(v0, u); ll res1 = 0, res2 = 0; for(ll c: G[u]){ if(c != p && c != v0){ res1 += dfslow(c, u); res2 += dfshigh(c, u); } } for(ll c: G[u]){ if(c != p && c != v0){ add_(c, u); } } // cout << u << ' ' << res1 << ' ' << res2;el; return res + min(res1, res2); } ll timer = 0; ll readInput(){ ll v; cin >> v; ll myval = timer; timer++; if(v){ a[myval] = v; }else{ ll c1 = readInput(), c2 = readInput(); G[c1].push_back(myval); G[myval].push_back(c1); G[c2].push_back(myval); G[myval].push_back(c2); } return myval; } int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); if(fopen(__file_name ".inp", "r")){ freopen(__file_name ".inp","r",stdin); freopen(__file_name ".out","w",stdout); } // code here cin >> n; timer = 1; ll root = readInput(); n = timer - 1; dfs_size(root, 0); cout << dfs(root, 0); return 0; } /* Code by: Nguyen Viet Trung Nhan Cau Giay Secondary School */

Compilation message (stderr)

rot.cpp: In function 'int main()':
rot.cpp:201:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  201 |         freopen(__file_name ".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rot.cpp:202:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  202 |         freopen(__file_name ".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...