CodeForces-427C.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include <algorithm>
  2. #include <climits>
  3. #include <iostream>
  4. #include <vector>
  5. using namespace std;
  6. int main() {
  7. ios::sync_with_stdio(false);
  8. cin.tie(nullptr);
  9. int n;
  10. cin >> n;
  11. vector<long long> cost(n);
  12. for (auto &x : cost) cin >> x;
  13. int m;
  14. cin >> m;
  15. vector<vector<int>> g(n);
  16. while (m--) {
  17. int u, v; cin >> u >> v;
  18. g[--u].push_back(--v);
  19. }
  20. vector<int> dfn(n), low(n), comp(n, -1), st;
  21. vector<bool> in_stack(n, false);
  22. int timer = 0, components = 0;
  23. auto dfs = [&](auto &&self, int u) -> void {
  24. dfn[u] = low[u] = ++timer;
  25. st.push_back(u); in_stack[u] = true;
  26. for (int v : g[u]) {
  27. if (!dfn[v]) { self(self, v); low[u] = min(low[u], low[v]); }
  28. else if (in_stack[v]) low[u] = min(low[u], dfn[v]);
  29. }
  30. if (low[u] == dfn[u]) {
  31. while (true) {
  32. int v = st.back(); st.pop_back(); in_stack[v] = false;
  33. comp[v] = components;
  34. if (v == u) break;
  35. }
  36. ++components;
  37. }
  38. };
  39. for (int v = 0; v < n; ++v) if (!dfn[v]) dfs(dfs, v);
  40. vector<long long> best(components, LLONG_MAX), ways(components, 0);
  41. for (int v = 0; v < n; ++v) {
  42. int c = comp[v];
  43. if (cost[v] < best[c]) best[c] = cost[v], ways[c] = 1;
  44. else if (cost[v] == best[c]) ++ways[c];
  45. }
  46. constexpr long long mod = 1'000'000'007LL;
  47. long long answer_cost = 0, answer_ways = 1;
  48. for (int c = 0; c < components; ++c) {
  49. answer_cost += best[c];
  50. answer_ways = answer_ways * ways[c] % mod;
  51. }
  52. cout << answer_cost << ' ' << answer_ways << '\n';
  53. }