fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MOD = 1e9+7;
  4. using ll = long long;
  5.  
  6. int N,Q,LOG;
  7. vector<vector<int>> up;
  8. vector<int> depth, tin, tout;
  9. vector<vector<int>> g;
  10. int timer=0;
  11.  
  12. void dfs0(int u, int p){
  13. tin[u]=++timer;
  14. up[0][u]= (p==-1 ? u : p);
  15. for(int k=1;k<LOG;k++) up[k][u]=up[k-1][ up[k-1][u] ];
  16. for(int v: g[u]) if(v!=p){
  17. depth[v]=depth[u]+1;
  18. dfs0(v,u);
  19. }
  20. tout[u]=timer;
  21. }
  22. bool is_anc(int u,int v){
  23. return tin[u]<=tin[v] && tout[v]<=tout[u];
  24. }
  25. int lca(int u,int v){
  26. if(is_anc(u,v)) return u;
  27. if(is_anc(v,u)) return v;
  28. for(int k=LOG-1;k>=0;k--){
  29. int x=up[k][u];
  30. if(!is_anc(x,v)) u=x;
  31. }
  32. return up[0][u];
  33. }
  34. int dist(int u,int v){ return depth[u]+depth[v]-2*depth[lca(u,v)]; }
  35.  
  36. vector<vector<pair<int,int>>> vt;
  37. vector<int> used, inS;
  38. ll dfs_sum(int u){
  39. ll s = inS[u]? u:0;
  40. for(auto [v,w]: vt[u]){
  41. ll sub = dfs_sum(v);
  42. s += sub;
  43. }
  44. return s;
  45. }
  46. ll dfs_ans(int u, ll tot, ll &ans){
  47. ll s = inS[u]? u:0;
  48. for(auto [v,w]: vt[u]){
  49. ll sub = dfs_ans(v, tot, ans);
  50. ans = (ans + (ll)w % MOD * (sub%MOD) % MOD * ((tot - sub)%MOD + MOD) % MOD) % MOD;
  51. s += sub;
  52. }
  53. return s;
  54. }
  55.  
  56. int main(){
  57. ios::sync_with_stdio(false);
  58. cin.tie(nullptr);
  59. cin>>N>>Q;
  60. g.assign(N+1,{});
  61. for(int i=0;i<N-1;i++){
  62. int u,v; cin>>u>>v;
  63. g[u].push_back(v); g[v].push_back(u);
  64. }
  65. LOG = 1; while((1<<LOG) <= N) LOG++;
  66. up.assign(LOG, vector<int>(N+1));
  67. depth.assign(N+1,0);
  68. tin.assign(N+1,0); tout.assign(N+1,0);
  69. dfs0(1,-1);
  70.  
  71. vt.assign(N+1,{});
  72. used.assign(N+1,0);
  73. inS.assign(N+1,0);
  74.  
  75. while(Q--){
  76. int K; cin>>K;
  77. vector<int> a(K);
  78. for(int i=0;i<K;i++) cin>>a[i];
  79. sort(a.begin(), a.end());
  80. a.erase(unique(a.begin(), a.end()), a.end());
  81. K = (int)a.size();
  82. ll totSum = 0;
  83. for(int x: a){ inS[x]=1; totSum += x; }
  84.  
  85. vector<int> vtx = a;
  86. sort(vtx.begin(), vtx.end(), [&](int x,int y){ return tin[x]<tin[y]; });
  87. int m = vtx.size();
  88. for(int i=0;i<m-1;i++) vtx.push_back(lca(vtx[i], vtx[i+1]));
  89. sort(vtx.begin(), vtx.end(), [&](int x,int y){ return tin[x]<tin[y]; });
  90. vtx.erase(unique(vtx.begin(), vtx.end()), vtx.end());
  91.  
  92. for(int x: vtx) vt[x].clear();
  93.  
  94. auto getLen = [&](int u,int v){ return dist(u,v); };
  95. vector<int> st;
  96. st.push_back(vtx[0]);
  97. for(size_t i=1;i<vtx.size();i++){
  98. int x = vtx[i];
  99. while(!st.empty() && !is_anc(st.back(), x)){
  100. int child = st.back(); st.pop_back();
  101. int parent = st.back();
  102. int w = getLen(parent, child);
  103. vt[parent].push_back({child, w});
  104. }
  105. if(st.empty() || st.back()!=x) st.push_back(x);
  106. }
  107. while(st.size()>1){
  108. int child = st.back(); st.pop_back();
  109. int parent = st.back();
  110. int w = getLen(parent, child);
  111. vt[parent].push_back({child, w});
  112. }
  113. int root = st[0];
  114.  
  115. ll ans=0;
  116. dfs_ans(root, totSum%MOD, ans);
  117. cout<< (ans%MOD+MOD)%MOD << "\n";
  118.  
  119. for(int x: a) inS[x]=0;
  120. }
  121. return 0;
  122. }
  123.  
Success #stdin #stdout 0s 5316KB
stdin
3 2
1 2
1 3
2
2 3
1
1
stdout
12
0