Guest User

Untitled

a guest
May 26th, 2018
916
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef long double ld;
  5. typedef pair <int, int> ii;
  6. typedef vector <int> vi;
  7. typedef vector <vi> vvi;
  8. typedef vector <ii> vii;
  9. typedef vector <vii> vvii;
  10. #define endl '\n'
  11. #define PB push_back
  12. #define MP make_pair
  13. #define fr first
  14. #define sc second
  15. #define OO (1000000000)         // ToDo
  16. #define EPS (1e-9)              // ToDo
  17. #define MOD (1000000007)        // ToDo
  18. #define all(v) ((v).begin()),((v).end())
  19. #define wt(x) cout<< #x <<" = "<<"\""<< (x) <<"\""<<endl
  20. #define FASTIO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
  21. void read_file(bool outToFile = true){
  22. #ifdef LOCAL_TEST
  23.     freopen("in", "rt", stdin);
  24.     if(outToFile)
  25.     freopen("out", "wt", stdout);
  26. #endif
  27. }
  28. //
  29. const int MAXN = 100 * 1000 + 99;
  30. //
  31. int TC;
  32. int n;
  33. int W[MAXN];
  34. vvi G;
  35. ll dp[MAXN], depth[MAXN];
  36. ll sub[MAXN];
  37. int P[MAXN]; // parent array
  38. ll S;
  39. //
  40. void DFS(int u=0, int p=-1){
  41.  
  42.     P[u] = p;
  43.     depth[u] = p == -1? 0 : depth[p] + 1;
  44.  
  45.     sub[u] = 1;
  46.     ll X = 0, Y = 0; // sizes of the left, right subtrees
  47.     for(int i=0; i<G[u].size(); i++)
  48.     {
  49.         int v = G[u][i];
  50.         if(v == p) continue;
  51.         DFS(v, u);
  52.  
  53.         sub[u] += sub[v];
  54.         if(X == 0)
  55.             X = sub[v];
  56.         else
  57.             Y = sub[v];
  58.     }
  59.     ll Z = n-1 - X - Y; // size of other nodes
  60.  
  61.     dp[u] = X*Y + Y*Z + Z*X;    // paths that don't end at u
  62.     dp[u] = dp[u] + n-1;        // adding n-1 paths which have u as an endpoint
  63.     dp[u] = dp[u]*2;            // multiplying by 2 for the two directions
  64.     dp[u] = dp[u] + 1;          // adding 1 for the path (u, u)
  65. }
  66. void solve(){
  67.     // calculations
  68.     DFS();
  69.  
  70.     // step one
  71.     S = 0;
  72.     for(int u=0; u<n; u++)
  73.         S += W[u] * dp[u];
  74.  
  75.     if(S == 0)
  76.     {
  77.         printf("0\n");
  78.         return;
  79.     }
  80.  
  81.     // step two
  82.     for(int u=0; u<n; u++)
  83.     {
  84.         if(S%dp[u] == 0) // dp[u] must be >= 1, no special cases
  85.         {
  86.             printf("1 ");
  87.             printf("%d\n", u+1);
  88.             //cerr << W[u] - S / dp[u] <<endl;
  89.             return;
  90.         }
  91.     }
  92.  
  93.     // step three
  94.     int cho = 0;
  95.     for(int u=0; u<n; u++)
  96.     {
  97.         if(depth[cho] < depth[u])
  98.             cho = u;
  99.     }
  100.  
  101.     int u = cho, v = P[u];
  102.     printf("2 ");
  103.     printf("%d %d\n", u+1, v+1);
  104.  
  105.     assert(dp[u] == 2*n-1 && dp[v] == 6*n-11);
  106.     assert(__gcd(dp[u], dp[v]) == 1); // because it's free
  107.     //cerr<< S <<endl;
  108. }
  109. //
  110. int main()
  111. {
  112.     //read_file();
  113.     scanf("%d", &TC);
  114.     while(TC--)
  115.     {
  116.         // reading input
  117.         scanf("%d", &n);
  118.         G.assign(n, vi());
  119.         for(int u=0; u<n; u++)
  120.             scanf("%lld", &W[u]);
  121.         for(int i=0; i<n-1; i++)
  122.         {
  123.             int u, v;
  124.             scanf("%d %d", &u, &v);
  125.             --u;--v;
  126.             G[u].PB(v);
  127.             G[v].PB(u);
  128.         }
  129.  
  130.  
  131.  
  132.         solve();
  133.         //printf("\n");
  134.     }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment