Advertisement
Guest User

Untitled

a guest
Dec 16th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.55 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define maxx 100012
  3. #define pp pair<ll,ll>
  4. #define fi first
  5. #define se second
  6. #define ll long long
  7. using namespace std;
  8.  
  9. const int oo=1e9;
  10. int n,q,R,k;
  11. vector<int> g[maxx];
  12. int f[maxx][22],deg[maxx];
  13. int dem=0;
  14. int realca,dislca;
  15.  
  16. int lca(int u,int v){
  17. if(deg[u]<deg[v])swap(u,v);
  18. for(int i=20;i>=0;i--){
  19. if(deg[u]-(1<<i)>=deg[v])
  20. u=f[u][i];
  21. }
  22. if(u==v)return u;
  23. for(int i=20;i>=0;i--){
  24. if(f[u][i]!=0&&f[u][i]!=f[v][i]){
  25. u=f[u][i];v=f[v][i];
  26. }
  27. }
  28. return f[u][0];
  29. }
  30.  
  31. void check(int z,int a,int b,int c){
  32. // cout<<z<<" "<<a<<" "<<b<<" "<<c<<"\n";
  33. int temp=0;
  34. int za=lca(z,a);
  35. int zb=lca(z,b);
  36. int zc=lca(z,c);
  37. // cout<<za<<" "<<zb<<" "<<zc<<"\n";
  38. temp+=deg[z]+deg[a]-2*deg[za];
  39. temp+=deg[z]+deg[b]-2*deg[zb];
  40. temp+=deg[z]+deg[c]-2*deg[zc];
  41. // cout<<temp<<"\n";
  42. if(temp<dislca){
  43. dislca=temp;
  44. realca=z;
  45. }
  46. }
  47.  
  48. void dfs(int u,int dem,int pa){
  49. deg[u]=dem;
  50. for(int v:g[u]){
  51. if(v==pa)continue;
  52. f[v][0]=u;
  53. dfs(v,dem+1,u);
  54. }
  55. }
  56.  
  57. void kaisa(){
  58. // freopen("TEST.INP","r",stdin);
  59. // freopen("TEST.OUT","w",stdout);
  60. ios_base::sync_with_stdio(false);
  61. cin.tie(NULL);
  62. cout.tie(NULL);
  63. while(cin>>n){
  64. if(n==0)return;
  65. for(int i=1;i<n;i++){
  66. int u,v;cin>>u>>v;
  67. g[u].push_back(v);
  68. g[v].push_back(u);
  69. }
  70. R=1;
  71. for(int j=0;j<=20;j++){
  72. for(int i=1;i<=n;i++){
  73. f[i][j]=0;
  74. }
  75. }
  76. dfs(R,1,0);
  77. for(int j=1;j<=20;j++){
  78. for(int i=1;i<=n;i++){
  79. if(f[i][j-1]!=0){
  80. f[i][j]=f[f[i][j-1]][j-1];
  81. }
  82. }
  83. }
  84. cin>>q;
  85. while(q--){
  86. char x;cin>>x;
  87. if(x=='!')
  88. cin>>R;
  89. else{
  90. int u,v;cin>>u>>v;
  91. k=lca(u,v);
  92. // cout<<lca(u,v)<<" "<<lca(u,R)<<" "<<lca(v,R)<<"aaa\n";
  93. dislca=oo;
  94. check(u,u,v,R);
  95. check(v,u,v,R);
  96. check(R,u,v,R);
  97. check(lca(u,v),u,v,R);
  98. check(lca(u,R),u,v,R);
  99. check(lca(v,R),u,v,R);
  100. cout<<realca<<"\n";
  101. }
  102. }
  103. for(int i=1;i<=n;i++){
  104. g[i].clear();
  105. deg[i]=0;
  106. }
  107. }
  108. }
  109.  
  110. main()
  111. {
  112. kaisa();
  113. return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement