[HDOJ6115] Factory(lca, 暴力乱搞)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6115

这题数据太弱了,看到群里说这题暴力就行,就打了一个暴力。

预处理每个点到根的距离,查的时候O(n^2logn)就行了。。。

当然不排除我的暴力姿势好(1e6^3姿势再好也白搭)

  1 /*
  2 ━━━━━┒ギリギリ♂ eye!
  3 ┓┏┓┏┓┃キリキリ♂ mind!
  4 ┛┗┛┗┛┃\○/
  5 ┓┏┓┏┓┃ /
  6 ┛┗┛┗┛┃ノ)
  7 ┓┏┓┏┓┃
  8 ┛┗┛┗┛┃
  9 ┓┏┓┏┓┃
 10 ┛┗┛┗┛┃
 11 ┓┏┓┏┓┃
 12 ┛┗┛┗┛┃
 13 ┓┏┓┏┓┃
 14 ┃┃┃┃┃┃
 15 ┻┻┻┻┻┻
 16 */
 17 #include <bits/stdc++.h>
 18 using namespace std;
 19 #define fr first
 20 #define sc second
 21 #define cl clear
 22 #define BUG puts("here!!!")
 23 #define W(a) while(a--)
 24 #define pb(a) push_back(a)
 25 #define Rint(a) scanf("%d", &a)
 26 #define Rll(a) scanf("%I64d", &a)
 27 #define Rs(a) scanf("%s", a)
 28 #define Cin(a) cin >> a
 29 #define FRead() freopen("in", "r", stdin)
 30 #define FWrite() freopen("out", "w", stdout)
 31 #define Rep(i, len) for(int i = 0; i < (len); i++)
 32 #define For(i, a, len) for(int i = (a); i < (len); i++)
 33 #define Cls(a) memset((a), 0, sizeof(a))
 34 #define Clr(a, x) memset((a), (x), sizeof(a))
 35 #define Full(a) memset((a), 0x7f7f7f, sizeof(a))
 36 #define lrt rt << 1
 37 #define rrt rt << 1 | 1
 38 #define pi 3.14159265359
 39 #define RT return
 40 #define lowbit(x) x & (-x)
 41 #define onenum(x) __builtin_popcount(x)
 42 typedef long long LL;
 43 typedef long double LD;
 44 typedef unsigned long long ULL;
 45 typedef pair<int, int> pii;
 46 typedef pair<string, int> psi;
 47 typedef pair<LL, LL> pll;
 48 typedef map<string, int> msi;
 49 typedef vector<int> vi;
 50 typedef vector<LL> vl;
 51 typedef vector<vl> vvl;
 52 typedef vector<bool> vb;
 53 
 54 const int maxn = 200100;
 55 int n, k, CNT, tot;
 56 int dp[2*maxn][22],vis[maxn];
 57 int b[2*maxn], used[maxn], f[2*maxn], pos[maxn];
 58 vector<pii> G[2*maxn];
 59 vi rG[2*maxn];
 60 int val[maxn];
 61 
 62 void st(int n,int x[]) {
 63     for(int i = 1; i <= n; i++) dp[i][0] = x[i];
 64     int k = int(log(n+1.0)/log(2.0));
 65     for(int j = 1; j <= k; j++) {
 66         for(int i = 1; i + (1 << j) - 1 <= n; i++) {
 67             dp[i][j] = min(dp[i][j-1], dp[i+(1<<(j-1))][j-1]);
 68         }
 69     }
 70 }
 71 
 72 int query(int l,int r) {
 73     int k = int(log(r-l+1.0)/log(2.0));
 74     return min(dp[l][k], dp[r-(1<<k)+1][k]);
 75 }
 76 
 77 void dfs(int s) {
 78     int t;
 79     used[s] = 1;
 80     int w = ++CNT;
 81     b[++tot] = w; f[w] = s;
 82     pos[s] = tot;
 83     Rep(i, G[s].size()) {
 84         t=G[s][i].first;
 85         if(used[t])  continue;
 86         val[t] = val[s] + G[s][i].second;
 87         dfs(t);
 88         b[++tot] = w;
 89     }
 90 }
 91 int lca(int a,int b) {
 92     if(pos[a] > pos[b]) swap(a,b);
 93     return f[query(pos[a], pos[b])];
 94 }
 95 
 96 signed main() {
 97     // FRead();
 98     int u, v;
 99     int n,m,w;
100     int T;
101     Rint(T);
102     W(T) {
103         Rint(n); Rint(m);
104         Rep(i, maxn) {
105             G[i].clear();
106             rG[i].clear();
107         }
108         For(i, 1, n) {
109             Rint(u); Rint(v); Rint(w);
110             G[u].push_back(make_pair(v,w));
111             G[v].push_back(make_pair(u,w));
112         }
113         For(i, 1, m+1) {
114             int cnt;
115             Rint(cnt);
116             W(cnt) {
117                 int f;
118                 Rint(f);
119                 rG[i].push_back(f);
120             }
121         }
122         val[1] = 0; CNT=0; tot = 0;
123         Cls(used);
124         dfs(1); st(tot,b);
125         Rint(k);
126         int ret;
127         W(k) {
128             int a, b;
129             Rint(a); Rint(b);
130             ret = 0x3f3f3f3f;
131             Rep(i, rG[a].size()) {
132                 Rep(j, rG[b].size()) {
133                     u = rG[a][i]; v = rG[b][j];
134                     w = val[u] + val[v] - 2 * val[lca(u,v)];
135                     ret = min(w, ret);
136                 }
137             }
138             printf("%d
", ret);
139         }
140     }
141     return 0;
142 }
原文地址:https://www.cnblogs.com/kirai/p/7388996.html