Submission #47395

#TimeUsernameProblemLanguageResultExecution timeMemory
47395daniel_02Construction of Highway (JOI18_construction)C++17
0 / 100
1040 ms55388 KiB
#include <bits/stdc++.h> #define ll long long #define pb push_back #define ppb pop_back #define pf push_front #define ppf pop_front using namespace std; const int N = 5e5 + 7; const int inf = 1e9 + 7; int a[N], pr[N]; struct con { int l, r; ll sm; con() { l = r = sm = 0; } }t[N * 7]; int cnt = 1; void update(int v, int tl, int tr, int pos, int x) { if (tl == tr) { t[v].sm += x; } else { int mid = (tl + tr) >> 1; if (mid >= pos) { if (!t[v].l) t[v].l = ++cnt; update(t[v].l, tl, mid, pos, x); } else { if (!t[v].r) t[v].r = ++cnt; update(t[v].r, mid + 1, tr, pos, x); } if (!t[v].l)t[v].l = ++cnt; if (!t[v].r)t[v].r = ++cnt; t[v].sm = t[t[v].l].sm + t[t[v].r].sm; } } ll get(int v, int tl, int tr, int l, int r) { if (tl > r || l > tr)return 0LL; if (l <= tl && tr <= r) { return t[v].sm; } else { int mid = (tl + tr) >> 1; if (!t[v].l) t[v].l = ++cnt; if (!t[v].r) t[v].r = ++cnt; return get(t[v].l, tl, mid, l, r) + get(t[v].r, mid + 1, tr, l, r); } } deque<int>dq; void dfs(int v) { if (v == 0) return; dq.pf(a[v]); dfs(pr[v]); } void conquer(int v) { ll ans = 0; dfs(v); for (int i = 0; i < dq.size(); i++) { ans += get(1, 1, inf, dq[i] + 1, inf); update(1, 1, inf, dq[i], 1); } dq.clear(); memset(t, 0, sizeof(t)); printf("%lld\n", ans); } void upd(int v, int x) { if (v == 0)return; a[v] = x; upd(pr[v], x); } main() { int n; cin >> n; for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i < n; i++) { int q, w; scanf("%d%d", &q, &w); if (i == 1) { puts("0"); pr[w] = q; a[q] = a[w]; continue; } conquer(q); upd(q, a[w]); pr[w] = q; } }

Compilation message (stderr)

construction.cpp: In function 'void conquer(int)':
construction.cpp:91:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < dq.size(); i++)
                     ~~^~~~~~~~~~~
construction.cpp: At global scope:
construction.cpp:108:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main()
      ^
construction.cpp: In function 'int main()':
construction.cpp:115:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &a[i]);
         ~~~~~^~~~~~~~~~~~~
construction.cpp:119:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &q, &w);
         ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...