Submission #947433

#TimeUsernameProblemLanguageResultExecution timeMemory
947433weakweakweakCapital City (JOI20_capital_city)C++17
30 / 100
180 ms94932 KiB
//好吧,我很笨 #include <bits/stdc++.h> using namespace std; int lt[510000], rt[510000], cnt[510000], n, k, col[510000], revlt[510000], now = 0, l[510000], r[510000]; int pos[510000] = {0}; vector<int> e[510000]; vector<int> qs[510000]; set<int> st[510000]; int a[510000] = {0}; void update (int i, int val) { for (; i <= n; i += i & -i) a[i] += val; } int query (int i) { int res = 0; for (; i > 0; i -= i & -i) res += a[i]; return res; } int query2 (int l, int r) {return query(r) - query(l - 1);} void dfs (int i, int par) { lt[i] = ++now, revlt[now] = i; for (int j : e[i]) if (j != par) dfs(j, i); rt[i] = now; } struct SEGMN { int a[810000]; void build (int lr, int rr, int id) { if (lr == rr) { a[id] = l[col[lr]]; return; } int mid = (lr + rr) / 2; build (lr, mid, id << 1); build(mid + 1, rr, id << 1 | 1); a[id] = min(a[id << 1], a[id << 1 | 1]); } int query (int lr, int rr, int ql, int qr, int id) { if (ql <= lr and rr <= qr) return a[id]; int res = INT_MAX, mid = (lr + rr) / 2; if (ql <= mid) res = min(res, query(lr, mid, ql, qr, id << 1)); if (qr > mid ) res = min(res, query(mid + 1, rr, ql, qr, id << 1 | 1)); return res; } } segl; struct SEGMX { int a[810000]; void build (int lr, int rr, int id) { if (lr == rr) { a[id] = r[col[lr]]; return; } int mid = (lr + rr) / 2; build (lr, mid, id << 1); build(mid + 1, rr, id << 1 | 1); a[id] = max(a[id << 1], a[id << 1 | 1]); } int query (int lr, int rr, int ql, int qr, int id) { if (ql <= lr and rr <= qr) return a[id]; int res = -1, mid = (lr + rr) / 2; if (ql <= mid) res = max(res, query(lr, mid, ql, qr, id << 1)); if (qr > mid ) res = max(res, query(mid + 1, rr, ql, qr, id << 1 | 1)); return res; } } segr; int main () { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> k; for (int i = 1; i < n; i++) { int x, y; cin >> x >> y; e[x].push_back(y); e[y].push_back(x); } int rt = 1; for (int i = 1; i <= n; i++) if (e[i].size() == 1) rt = i; dfs(rt, rt); for (int i = 1; i <= n; i++) { cin >> col[lt[i]]; if (cnt[col[lt[i]]]++ == 0) l[col[lt[i]]] = r[col[lt[i]]] = lt[i]; else l[col[lt[i]]] = min(l[col[lt[i]]], lt[i]), r[col[lt[i]]] = max(r[col[lt[i]]], lt[i]); } for (int i = 1; i <= k; i++) { qs[r[i]].push_back(l[i]); st[r[i]] . insert(l[i]); } segl.build(1, n, 1); segr.build(1, n, 1); int ans = k; for (int i = 1; i <= n; i++) { if (pos[col[i]]) update(pos[col[i]], -1); pos[col[i]] = i; update(i, 1); for (int j : qs[i]) { int wow1 = segl.query(1, n, j, i, 1), wow2 = segr.query(1, n, j, i, 1); if (wow1 >= j and wow2 <= i) ans = min(ans, query2(j, i)); else if (st[wow2].count(wow1) == 0) { qs[wow2].push_back(wow1); st[wow2].insert(wow1); } } } cout << ans - 1 << '\n'; return 0;}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...