加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

P2420 让我们异或吧

发布时间:2020-12-15 01:57:00 所属栏目:Java 来源:网络整理
导读:树链剖分 1 #include algorithm 2 #include cstdio 3 #include vector 4 using namespace std; 5 const int maxn = 100000 + 10 ; 6 int n,m,r,p,dis[maxn],dep[maxn],father[maxn][ 18 ]; 7 vectorpair int , int edges[maxn]; 8 inline void dfs( int now,

树链剖分

 1 #include <algorithm>
 2 #include <cstdio>
 3 #include <vector>
 4 using namespace std;
 5 const int maxn = 100000 + 10;
 6 int n,m,r,p,dis[maxn],dep[maxn],father[maxn][18];
 7 vector<pair<int,int> > edges[maxn];
 8 inline void dfs(int now,int f,int Xor) {  //dfs预处理
 9     dis[now] = Xor;
10     for (size_t i = 0;i < edges[now].size();i++)
11         if (edges[now][i].first != f) {
12             dep[edges[now][i].first] = dep[now]+1;
13             father[edges[now][i].first][0] = now;
14             dfs(edges[now][i].first,now,Xor^edges[now][i].second);
15         }
16 }
17 inline void init() {  //倍增
18     for (int j = 1;j < 18;j++)
19         for (int i = 1;i <= n;i++) father[i][j] = father[father[i][j-1]][j-1];
20 }
21 inline int lca(int a,int b) {  //求lca
22     if (dep[a] < dep[b]) swap(a,b);
23     for (int i = 0;i < 18;i++)
24         if ((1<<i)&dep[a]-dep[b]) a = father[a][i];  //让深的点往上走
25     if (a == b) return a;  //走到同一点
26     for (int i = 18;i >= 0;i--)
27         if (father[a][i] != father[b][i]) {  //两个一起往上走
28             a = father[a][i];
29             b = father[b][i];
30         }
31     return father[a][0];
32 }
33 int main() {
34     scanf("%d",&n);
35     for (int i = 1,u,v,w;i < n;i++) {
36         scanf("%d%d%d",&u,&v,&w);
37         edges[u].push_back(make_pair(v,w));
38         edges[v].push_back(make_pair(u,w));
39     }
40     dfs(1,1,1);
41     init();
42     scanf("%d",&m);
43     for (int i = 1,v;i <= m;i++) {
44         scanf("%d%d",&v);
45         int tmp = lca(u,v);
46         printf("%dn",(dis[u]^dis[tmp])^(dis[v]^dis[tmp]));
47     }
48     return 0;
49 }

?

#include <algorithm>#include <cstdio>#include <vector>usingnamespacestd; constint maxn = 100000 + 10 n,father[maxn][18]; vector<pair<,> > edges[maxn]; inline void dfs(int now,int f,int Xor) { //dfs预处理 dis[now] = Xor; for (size_t i = 0;i < edges[now].size();i++) if (edges[now][i].first != f) { dep[edges[now][i].first] = dep[now]+1; father[edges[now][i].first][] = now; dfs(edges[now][i].first,Xor^edges[now][i].second); } } inline void init() //倍增 j = ;j < ;j++) ;i <= n;i++) father[i][j] = father[father[i][j-1]][j]; } inline int lca(int a,int b) //求lca (dep[a] < dep[b]) swap(a,b); ;i < ;i++) ((<<i)&dep[a]-dep[b]) a = father[a][i]; //让深的点往上走 (a == b) return a; //走到同一点;i >= ;i--) (father[a][i] != father[b][i]) { //两个一起往上走 a = father[a][i]; b = father[b][i]; } father[a][int main() { scanf("%d""%d%d%d"); init(); "%d%d" tmp = lca(u,v); printf"%dn"return; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读