日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[HDU 6203] ping ping ping

發布時間:2024/3/26 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [HDU 6203] ping ping ping 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=6203

題意:給出一棵樹, 給出p組點對(u, v), 求刪除最少的點使得這p組點對均不聯通。(n104,p2?104

思路:處理出每組點對的lca,按lca的深度從大到小依次考慮, 如果u, v均沒有被標記, 則標記lca子樹內的所有點, 答案+1。

時間復雜度:O(nlogn)

#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm>#define ls (x << 1) #define rs (x << 1 | 1) #define mid ((l + r) >> 1)using namespace std;const int N = (int)5e4 + 10;int n; int cnt, lst[N], to[N * 2], nxt[N * 2];void add(int u, int v){nxt[++ cnt] = lst[u]; lst[u] = cnt; to[cnt] = v;nxt[++ cnt] = lst[v]; lst[v] = cnt; to[cnt] = u; }int indx, L[N], R[N], fa[N][20], dep[N]; void dfs(int u, int pre){L[u] = ++ indx;fa[u][0] = pre; dep[u] = dep[pre] + 1;for (int j = lst[u]; j; j = nxt[j]){int v = to[j];if (v == pre) continue;dfs(v, u); }R[u] = indx; }int lca(int u, int v){if (dep[u] < dep[v]) swap(u, v);for (int k = dep[u] - dep[v], j = 0; k; j ++, k >>= 1)if (k & 1) u = fa[u][j];if (u == v) return u;for (int j = 19; j >= 0; j --)if (fa[u][j] != fa[v][j]) u = fa[u][j], v = fa[v][j];return fa[u][0]; }int bj[N << 1], query[N][3], id[N]; void build(int x, int l, int r){bj[x] = 0;if (l == r) return;build(ls, l, mid);build(rs, mid + 1, r); }bool cmp(int i, int j){return dep[query[i][2]] > dep[query[j][2]]; }bool ask(int x, int l, int r, int pos){if (bj[x]) return 1;if (l == r) return 0;if (pos <= mid) return ask(ls, l, mid, pos);return ask(rs, mid + 1, r, pos); }void modf(int x, int l, int r, int L, int R){if (l == L && r == R){bj[x] = 1; return;}if (R <= mid) return modf(ls, l, mid, L, R);if (L > mid) return modf(rs, mid + 1, r, L, R);return modf(ls, l, mid, L, mid), modf(rs, mid + 1, r, mid + 1, R); }int main(){while (scanf("%d", &n) != EOF){cnt = 0; n ++;for (int i = 1; i <= n; i ++) lst[i] = 0;for (int i = 1, u, v; i < n; i ++){scanf("%d %d", &u, &v);u ++; v ++; add(u, v);}indx = 0;dfs(1, 0);for (int j = 1; j < 20; j ++)for (int i = 1; i <= n; i ++)fa[i][j] = fa[fa[i][j - 1]][j - 1];build(1, 1, n);int p; scanf("%d", &p);for (int i = 1, u, v; i <= p; i ++){scanf("%d %d", &u, &v); u ++; v ++;query[i][0] = u, query[i][1] = v, query[i][2] = lca(u, v);}for (int i = 1; i <= p; i ++) id[i] = i;sort(id + 1, id + p + 1, cmp);int ans = 0;for (int i = 1; i <= p; i ++){int u = query[id[i]][0], v = query[id[i]][1], Lca = query[id[i]][2];bool ok = ask(1, 1, n, L[u]) || ask(1, 1, n, L[v]);if (!ok) ans ++, modf(1, 1, n, L[Lca], R[Lca]);}printf("%d\n", ans);}return 0; }

總結

以上是生活随笔為你收集整理的[HDU 6203] ping ping ping的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。