Submission #769357

# Submission time Handle Problem Language Result Execution time Memory
769357 2023-06-29T12:57:03 Z peijar Two Currencies (JOI23_currencies) C++17
100 / 100
974 ms 50136 KB
#include <bits/stdc++.h>
#define int long long
using namespace std;

string to_string(string s) { return s; }
template <typename T> string to_string(T v) {
  bool first = true;
  string res = "[";
  for (const auto &x : v) {
    if (!first)
      res += ", ";
    first = false;
    res += to_string(x);
  }
  res += "]";
  return res;
}

void dbg_out() { cout << endl; }
template <typename Head, typename... Tail> void dbg_out(Head H, Tail... T) {
  cout << ' ' << to_string(H);
  dbg_out(T...);
}

#ifdef DEBUG
#define dbg(...) cout << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
#else
#define dbg(...)
#endif

template <class T> class Fenwick {
public:
  int lim;
  vector<T> bit;

  Fenwick(int n) : lim(n + 1), bit(lim) {}

  void upd(int pos, T val) {
    for (pos++; pos < lim; pos += pos & -pos)
      bit[pos] += val;
  }

  T sum(int r) { // < r
    T ret = 0;
    for (; r; r -= r & -r)
      ret += bit[r];
    return ret;
  }

  T sum(int l, int r) { // [l, r)
    return sum(r) - sum(l);
  }
};

const int MAXN = 1e5;
const int MAXP = 17;

int par[MAXP][MAXN];
vector<int> adj[MAXN];
int depth[MAXN], tin[MAXN], tout[MAXN];
int T;

void dfs(int u, int p) {
  tin[u] = T++;
  par[0][u] = p;
  for (int i = 0; i < MAXP - 1; ++i)
    par[i + 1][u] = par[i][par[i][u]];
  for (int v : adj[u])
    if (v != p) {
      depth[v] = depth[u] + 1;
      dfs(v, u);
    }
  tout[u] = T++;
}

int getLca(int u, int v) {
  if (depth[u] < depth[v])
    swap(u, v);
  int diff = depth[u] - depth[v];
  for (int p = 0; p < MAXP; ++p)
    if ((1 << p) & diff)
      u = par[p][u];
  if (u == v)
    return u;
  for (int p = MAXP - 1; p >= 0; --p)
    if (par[p][u] != par[p][v])
      u = par[p][u], v = par[p][v];

  return par[0][u];
}

signed main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(0);

  int nbSommets, nbPoids, nbRequetes;
  cin >> nbSommets >> nbPoids >> nbRequetes;

  vector<pair<int, int>> edges(nbSommets - 1);
  for (auto &[u, v] : edges) {
    cin >> u >> v;
    --u, --v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }

  dfs(0, 0);
  vector<pair<int, int>> weights(nbPoids);
  for (int i = 0; i < nbPoids; ++i) {
    int p, c;
    cin >> p >> c;
    --p;
    auto [u, v] = edges[p];
    if (depth[u] > depth[v])
      swap(u, v);
    weights[i] = pair(c, v);
  }
  sort(weights.begin(), weights.end());

  vector<tuple<int, int, int, int>> queries(nbRequetes);
  for (auto &[s, t, gold, silver] : queries) {
    cin >> s >> t >> gold >> silver;
    --s, --t;
    if (tin[s] > tin[t])
      swap(s, t);
  }
  dbg(nbSommets, nbPoids, nbRequetes);
  vector<int> lca(nbRequetes);
  for (int i = 0; i < nbRequetes; ++i) {
    auto [s, t, gold, silver] = queries[i];
    lca[i] = getLca(s, t);
    dbg(s, t, lca[i]);
  }

  vector<int> lo(nbRequetes), up(nbRequetes, nbPoids);
  vector<int> cntFinal(nbRequetes, 1e18);
  vector<int> cntTotal(nbRequetes);

  while (true) {
    bool change = false;
    vector<vector<int>> needCheck(nbPoids + 1);
    for (int i = 0; i < nbRequetes; ++i) {
      if (lo[i] < up[i]) {
        int mid = (lo[i] + up[i] + 1) / 2;
        change = true;
        needCheck[mid].push_back(i);
      } else
        needCheck[lo[i]].push_back(i);
    }

    Fenwick<int> fenCnt(T), fenSum(T);

    for (int iPoids = 0; iPoids <= nbPoids; ++iPoids) {
      for (int iRequete : needCheck[iPoids]) {
        int l = lca[iRequete];
        auto [u, v, gold, silver] = queries[iRequete];
        int cnt = fenCnt.sum(tin[u] + 1) + fenCnt.sum(tin[v] + 1) -
                  2 * fenCnt.sum(tin[l] + 1);
        int sum = fenSum.sum(tin[u] + 1) + fenSum.sum(tin[v] + 1) -
                  2 * fenSum.sum(tin[l] + 1);
        cntFinal[iRequete] = cnt;
        if (sum <= silver)
          lo[iRequete] = iPoids;
        else
          up[iRequete] = iPoids - 1;
      }

      if (iPoids < nbPoids) {
        auto [c, u] = weights[iPoids];
        fenCnt.upd(tin[u], 1);
        fenCnt.upd(tout[u], -1);
        fenSum.upd(tin[u], c);
        fenSum.upd(tout[u], -c);
      }
    }
    for (int iRequete = 0; iRequete < nbRequetes; ++iRequete) {
      int l = lca[iRequete];
      auto [u, v, gold, silver] = queries[iRequete];
      int cnt = fenCnt.sum(tin[u] + 1) + fenCnt.sum(tin[v] + 1) -
                2 * fenCnt.sum(tin[l] + 1);
      cntTotal[iRequete] = cnt;
    }
    if (!change)
      break;
  }
  for (int i = 0; i < nbRequetes; ++i) {
    auto [u, v, gold, silver] = queries[i];
    dbg(cntFinal[i], cntTotal[i]);
    cout << max(-1LL, gold - (cntTotal[i] - cntFinal[i])) << endl;
  }
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2772 KB Output is correct
2 Correct 1 ms 2772 KB Output is correct
3 Correct 1 ms 2772 KB Output is correct
4 Correct 1 ms 2772 KB Output is correct
5 Correct 7 ms 3412 KB Output is correct
6 Correct 9 ms 3540 KB Output is correct
7 Correct 9 ms 3336 KB Output is correct
8 Correct 10 ms 3584 KB Output is correct
9 Correct 9 ms 3592 KB Output is correct
10 Correct 11 ms 3608 KB Output is correct
11 Correct 10 ms 3504 KB Output is correct
12 Correct 10 ms 3588 KB Output is correct
13 Correct 11 ms 3760 KB Output is correct
14 Correct 9 ms 3668 KB Output is correct
15 Correct 9 ms 3600 KB Output is correct
16 Correct 9 ms 3652 KB Output is correct
17 Correct 9 ms 3580 KB Output is correct
18 Correct 9 ms 3592 KB Output is correct
19 Correct 8 ms 3632 KB Output is correct
20 Correct 8 ms 3540 KB Output is correct
21 Correct 8 ms 3596 KB Output is correct
22 Correct 8 ms 3540 KB Output is correct
23 Correct 8 ms 3536 KB Output is correct
24 Correct 9 ms 3616 KB Output is correct
25 Correct 9 ms 3628 KB Output is correct
26 Correct 7 ms 3540 KB Output is correct
27 Correct 7 ms 3540 KB Output is correct
28 Correct 7 ms 3540 KB Output is correct
29 Correct 7 ms 3592 KB Output is correct
30 Correct 11 ms 3616 KB Output is correct
31 Correct 9 ms 3540 KB Output is correct
32 Correct 11 ms 3588 KB Output is correct
33 Correct 9 ms 3636 KB Output is correct
34 Correct 9 ms 3668 KB Output is correct
35 Correct 9 ms 3708 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2772 KB Output is correct
2 Correct 9 ms 3616 KB Output is correct
3 Correct 9 ms 3540 KB Output is correct
4 Correct 9 ms 3540 KB Output is correct
5 Correct 536 ms 40264 KB Output is correct
6 Correct 667 ms 36016 KB Output is correct
7 Correct 598 ms 37876 KB Output is correct
8 Correct 481 ms 35692 KB Output is correct
9 Correct 462 ms 35296 KB Output is correct
10 Correct 782 ms 44664 KB Output is correct
11 Correct 769 ms 44652 KB Output is correct
12 Correct 728 ms 44680 KB Output is correct
13 Correct 750 ms 44640 KB Output is correct
14 Correct 773 ms 44692 KB Output is correct
15 Correct 812 ms 49668 KB Output is correct
16 Correct 779 ms 50068 KB Output is correct
17 Correct 751 ms 49380 KB Output is correct
18 Correct 849 ms 44676 KB Output is correct
19 Correct 888 ms 44632 KB Output is correct
20 Correct 880 ms 44644 KB Output is correct
21 Correct 690 ms 44496 KB Output is correct
22 Correct 718 ms 44708 KB Output is correct
23 Correct 698 ms 44832 KB Output is correct
24 Correct 718 ms 44724 KB Output is correct
25 Correct 692 ms 45440 KB Output is correct
26 Correct 799 ms 45216 KB Output is correct
27 Correct 591 ms 45396 KB Output is correct
28 Correct 490 ms 44376 KB Output is correct
29 Correct 433 ms 44364 KB Output is correct
30 Correct 554 ms 44636 KB Output is correct
31 Correct 582 ms 45008 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2772 KB Output is correct
2 Correct 9 ms 3700 KB Output is correct
3 Correct 9 ms 3668 KB Output is correct
4 Correct 9 ms 3656 KB Output is correct
5 Correct 501 ms 42292 KB Output is correct
6 Correct 459 ms 41000 KB Output is correct
7 Correct 624 ms 35140 KB Output is correct
8 Correct 945 ms 50000 KB Output is correct
9 Correct 963 ms 50136 KB Output is correct
10 Correct 859 ms 50040 KB Output is correct
11 Correct 721 ms 50020 KB Output is correct
12 Correct 730 ms 50012 KB Output is correct
13 Correct 665 ms 50056 KB Output is correct
14 Correct 570 ms 49652 KB Output is correct
15 Correct 577 ms 49444 KB Output is correct
16 Correct 730 ms 49692 KB Output is correct
17 Correct 644 ms 49652 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2772 KB Output is correct
2 Correct 1 ms 2772 KB Output is correct
3 Correct 1 ms 2772 KB Output is correct
4 Correct 1 ms 2772 KB Output is correct
5 Correct 7 ms 3412 KB Output is correct
6 Correct 9 ms 3540 KB Output is correct
7 Correct 9 ms 3336 KB Output is correct
8 Correct 10 ms 3584 KB Output is correct
9 Correct 9 ms 3592 KB Output is correct
10 Correct 11 ms 3608 KB Output is correct
11 Correct 10 ms 3504 KB Output is correct
12 Correct 10 ms 3588 KB Output is correct
13 Correct 11 ms 3760 KB Output is correct
14 Correct 9 ms 3668 KB Output is correct
15 Correct 9 ms 3600 KB Output is correct
16 Correct 9 ms 3652 KB Output is correct
17 Correct 9 ms 3580 KB Output is correct
18 Correct 9 ms 3592 KB Output is correct
19 Correct 8 ms 3632 KB Output is correct
20 Correct 8 ms 3540 KB Output is correct
21 Correct 8 ms 3596 KB Output is correct
22 Correct 8 ms 3540 KB Output is correct
23 Correct 8 ms 3536 KB Output is correct
24 Correct 9 ms 3616 KB Output is correct
25 Correct 9 ms 3628 KB Output is correct
26 Correct 7 ms 3540 KB Output is correct
27 Correct 7 ms 3540 KB Output is correct
28 Correct 7 ms 3540 KB Output is correct
29 Correct 7 ms 3592 KB Output is correct
30 Correct 11 ms 3616 KB Output is correct
31 Correct 9 ms 3540 KB Output is correct
32 Correct 11 ms 3588 KB Output is correct
33 Correct 9 ms 3636 KB Output is correct
34 Correct 9 ms 3668 KB Output is correct
35 Correct 9 ms 3708 KB Output is correct
36 Correct 1 ms 2772 KB Output is correct
37 Correct 9 ms 3616 KB Output is correct
38 Correct 9 ms 3540 KB Output is correct
39 Correct 9 ms 3540 KB Output is correct
40 Correct 536 ms 40264 KB Output is correct
41 Correct 667 ms 36016 KB Output is correct
42 Correct 598 ms 37876 KB Output is correct
43 Correct 481 ms 35692 KB Output is correct
44 Correct 462 ms 35296 KB Output is correct
45 Correct 782 ms 44664 KB Output is correct
46 Correct 769 ms 44652 KB Output is correct
47 Correct 728 ms 44680 KB Output is correct
48 Correct 750 ms 44640 KB Output is correct
49 Correct 773 ms 44692 KB Output is correct
50 Correct 812 ms 49668 KB Output is correct
51 Correct 779 ms 50068 KB Output is correct
52 Correct 751 ms 49380 KB Output is correct
53 Correct 849 ms 44676 KB Output is correct
54 Correct 888 ms 44632 KB Output is correct
55 Correct 880 ms 44644 KB Output is correct
56 Correct 690 ms 44496 KB Output is correct
57 Correct 718 ms 44708 KB Output is correct
58 Correct 698 ms 44832 KB Output is correct
59 Correct 718 ms 44724 KB Output is correct
60 Correct 692 ms 45440 KB Output is correct
61 Correct 799 ms 45216 KB Output is correct
62 Correct 591 ms 45396 KB Output is correct
63 Correct 490 ms 44376 KB Output is correct
64 Correct 433 ms 44364 KB Output is correct
65 Correct 554 ms 44636 KB Output is correct
66 Correct 582 ms 45008 KB Output is correct
67 Correct 2 ms 2772 KB Output is correct
68 Correct 9 ms 3700 KB Output is correct
69 Correct 9 ms 3668 KB Output is correct
70 Correct 9 ms 3656 KB Output is correct
71 Correct 501 ms 42292 KB Output is correct
72 Correct 459 ms 41000 KB Output is correct
73 Correct 624 ms 35140 KB Output is correct
74 Correct 945 ms 50000 KB Output is correct
75 Correct 963 ms 50136 KB Output is correct
76 Correct 859 ms 50040 KB Output is correct
77 Correct 721 ms 50020 KB Output is correct
78 Correct 730 ms 50012 KB Output is correct
79 Correct 665 ms 50056 KB Output is correct
80 Correct 570 ms 49652 KB Output is correct
81 Correct 577 ms 49444 KB Output is correct
82 Correct 730 ms 49692 KB Output is correct
83 Correct 644 ms 49652 KB Output is correct
84 Correct 542 ms 36816 KB Output is correct
85 Correct 520 ms 30256 KB Output is correct
86 Correct 531 ms 28656 KB Output is correct
87 Correct 838 ms 44580 KB Output is correct
88 Correct 882 ms 44648 KB Output is correct
89 Correct 917 ms 44544 KB Output is correct
90 Correct 974 ms 44592 KB Output is correct
91 Correct 843 ms 44660 KB Output is correct
92 Correct 840 ms 48320 KB Output is correct
93 Correct 847 ms 49336 KB Output is correct
94 Correct 943 ms 44612 KB Output is correct
95 Correct 880 ms 44720 KB Output is correct
96 Correct 877 ms 44744 KB Output is correct
97 Correct 886 ms 44620 KB Output is correct
98 Correct 782 ms 44740 KB Output is correct
99 Correct 844 ms 44644 KB Output is correct
100 Correct 786 ms 44692 KB Output is correct
101 Correct 822 ms 44776 KB Output is correct
102 Correct 752 ms 45220 KB Output is correct
103 Correct 740 ms 45296 KB Output is correct
104 Correct 837 ms 45204 KB Output is correct
105 Correct 648 ms 44556 KB Output is correct
106 Correct 570 ms 44696 KB Output is correct
107 Correct 585 ms 44408 KB Output is correct
108 Correct 536 ms 44444 KB Output is correct