Submission #1265858

#TimeUsernameProblemLanguageResultExecution timeMemory
1265858quangminh412Tourism (JOI23_tourism)C++17
52 / 100
5086 ms20312 KiB
/* Ben Watson Quang Minh MasterDDDDD */ #include <bits/stdc++.h> using namespace std; #define ll long long const string name = "test"; void solve(); signed main() { if (fopen((name + ".inp").c_str(), "r")) { freopen((name + ".inp").c_str(), "r", stdin); freopen((name + ".out").c_str(), "w", stdout); } ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); return 0; } // main program const int oo = 0x3f3f3f3f; const int maxn = 1e5 + 1; struct FenwickTree { vector<int> bits; int n; FenwickTree(int n) : n(n) { bits.resize(n + 1, 0); } void update(int pos, int val) { for (; pos <= n; pos += (pos & (-pos))) bits[pos] += val; } int query(int pos) { int res = 0; for (; pos > 0; pos -= (pos & (-pos))) res += bits[pos]; return res; } int query(int l, int r) { return query(r) - query(l - 1); } }; vector<int> adj[maxn], queries[maxn]; int c[maxn], ans[maxn], L[maxn]; FenwickTree bit(maxn); int n, m, q; // tree processing int pos[maxn], tp[maxn], sz[maxn], par[maxn], d[maxn]; void DFS(int u, int p = -1) { sz[u] = 1; for (int v : adj[u]) { if (v == p) continue; par[v] = u; d[v] = d[u] + 1; DFS(v, u); sz[u] += sz[v]; } } int timeDFS = 0; void DFS_HLD(int u, int top) { pos[u] = ++timeDFS; tp[u] = top; int nxt = -1; for (int v : adj[u]) if (v != par[u] && (nxt == -1 || sz[v] > sz[nxt])) nxt = v; if (nxt != -1) DFS_HLD(nxt, top); for (int v : adj[u]) if (v != par[u] && v != nxt) DFS_HLD(v, v); } // handle queries int Left[maxn], X[maxn]; set<int> se; void update(int l, int r, int x) { int st = *(se.lower_bound(r)); while (st > 0) { int u = Left[st], v = st; st = u - 1; if (v < l) break; if (r < u) continue; int le = max(u, l), ri = min(v, r), val = X[v]; if (u < l) { se.insert(l - 1); Left[l - 1] = u; X[l - 1] = val; Left[ri] = l; X[ri] = x; } if (r < v) { se.insert(r); Left[v] = r + 1; X[v] = val; Left[r] = le; X[r] = x; } bit.update(val + 1, -(ri - le + 1)); X[ri] = x; } bit.update(x + 1, r - l + 1); } void update_path(int u, int v, int x) { while (tp[u] != tp[v]) { if (d[tp[u]] < d[tp[v]]) swap(u, v); update(pos[tp[u]], pos[u], x); u = par[tp[u]]; } if (d[u] > d[v]) swap(u, v); update(pos[u], pos[v], x); } void solve() { cin >> n >> m >> q; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } for (int i = 1; i <= m; i++) cin >> c[i]; DFS(1); DFS_HLD(1, 1); bit.update(1, n); se.insert(n); Left[n] = 1; for (int i = 1; i <= q; i++) { int l, r; cin >> l >> r; L[i] = l; queries[r].push_back(i); } for (int i = 1; i <= m; i++) { if (i != 1) update_path(c[i - 1], c[i], i - 1); update_path(c[i], c[i], i); for (int idx : queries[i]) ans[idx] = bit.query(L[idx] + 1, m + 1); } for (int i = 1; i <= q; i++) cout << ans[i] << '\n'; }

Compilation message (stderr)

tourism.cpp: In function 'int main()':
tourism.cpp:19:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |         freopen((name + ".inp").c_str(), "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tourism.cpp:20:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |         freopen((name + ".out").c_str(), "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...