P2420 让我们异或吧
树链剖分 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 } ? 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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |