QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#820706#9905. 哈夫曼树wsyear0 44ms477864kbC++203.5kb2024-12-18 23:40:382024-12-18 23:40:39

Judging History

你现在查看的是最新测评结果

  • [2024-12-18 23:40:39]
  • 评测
  • 测评结果:0
  • 用时:44ms
  • 内存:477864kb
  • [2024-12-18 23:40:38]
  • 提交

answer

// Problem: E. 哈夫曼树
// Memory Limit: 1024 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// Author: Donomonayuas

#include <bits/stdc++.h>

#define rep(i, j, k) for (int i = (j); i <= (k); ++i)
#define per(i, j, k) for (int i = (j); i >= (k); --i)
#define SZ(v) int((v).size())
#define ALL(v) (v).begin(),(v).end()
#define fi first
#define se second
using ll = long long;
using ull = unsigned long long;
using pii = std::pair<int, int>;
using pll = std::pair<ll, ll>;

template<class T>inline void chkmn(T &x, T y) { if (y < x) x = y; }
template<class T>inline void chkmx(T &x, T y) { if (y > x) x = y; }

using namespace std;

mt19937_64 rnd(random_device{}());
const int maxn = 200010;
const int maxm = maxn * 50;
const ll maxv = 1e15;
map<pll, ull> MP;
map<ull, int> used;

ull get(ull x, ull y) {
  if (x > y) swap(x, y);
  if (MP.count(pll(x, y))) return MP[pll(x, y)];
  ull ha = rnd();
  while (used[ha]) ha = rnd();
  used[ha] = 1;
  return MP[pll(x, y)] = ha;
}

struct node {
  int emp, len;
  ull hal, har, ham;
  ll vall, valr;
  node() { emp = 1; }
  node(ll x, int cnt) {
    if (!cnt) {
      emp = 1;
    } else {
      emp = 0;
      len = cnt & 1;
      hal = har = get(x, x) * (cnt >> 1);
      vall = valr = x;
      if (!(cnt & 1)) ham = get(x, x) * ((cnt >> 1) - 1);
    }
  }
  friend node operator+(node x, node y) {
    node res;
    res.emp = x.emp & y.emp;
    if (res.emp) return res;
    if (x.emp) return y;
    if (y.emp) return x;
    res.len = x.len ^ y.len;
    res.vall = x.vall, res.valr = y.valr;
    if (x.len && y.len) {
      res.hal = res.har = x.har + y.hal + get(x.valr, y.vall);
      res.ham = x.hal + y.har;
    } else if (!x.len && !y.len) {
      res.hal = res.har = x.hal + y.har;
      res.ham = x.ham + y.ham + get(x.valr, y.vall);
    } else if (x.len && !y.len) {
      res.hal = x.hal + y.hal;
      res.har = x.har + get(x.valr, y.vall) + y.ham;
    } else if (!x.len && y.len) {
      res.har = x.har + y.har;
      res.hal = x.ham + get(x.valr, y.vall) + y.hal;
    }
    return res;
  }
} t[maxm];

int n, q, L[maxn], R[maxn], fa[maxn], ok[maxn], tot, rt, ls[maxm], rs[maxm], cc[maxm], dep[maxn];
ll a[maxn];
ull sum;

#define mid ((l + r) >> 1)

void upd(int &p, ll l, ll r, ll x, int v) {
  if (!p) p = ++tot;
  if (l == r) return cc[p] += v, t[p] = node(x, cc[p]), void();
  if (x <= mid) upd(ls[p], l, mid, x, v);
  else upd(rs[p], mid + 1, r, x, v);
  t[p] = t[ls[p]] + t[rs[p]];
}

#undef mid

ull get() { return t[rt].har; }

int main() {
  cin.tie(nullptr) -> ios::sync_with_stdio(false);
  cin >> n >> q, q--;
  rep (i, 1, n) cin >> a[i], dep[i] = 1;
  rep (i, n + 1, 2 * n - 1) cin >> L[i] >> R[i], fa[L[i]] = fa[R[i]] = i;
  rep (i, n + 1, 2 * n - 1) dep[i] = max(dep[L[i]], dep[R[i]]) + 1;
  if (dep[2 * n - 1] > 60) {
    rep (i, 1, q + 1) cout << "NO\n";
    return 0;
  }
  rep (i, 1, n) {
    int x = fa[i];
    while (x) a[x] += a[i], x = fa[x];
  }
  rep (i, 1, 2 * n - 1) upd(rt, 1, maxv, a[i], 1);
  rep (i, n + 1, 2 * n - 1) sum += get(a[L[i]], a[R[i]]);
  cout << (sum == get() ? "YES" : "NO") << '\n';
  while (q--) {
    ll x, v;
    cin >> x >> v, v -= a[x];
    while (x) {
      if (fa[x]) sum -= get(a[L[fa[x]]], a[R[fa[x]]]);
      upd(rt, 1, maxv, a[x], -1), a[x] += v, upd(rt, 1, maxv, a[x], 1);
      if (fa[x]) sum += get(a[L[fa[x]]], a[R[fa[x]]]);
      x = fa[x];
    }
    cout << (sum == get() ? "YES" : "NO") << '\n';
  }
}

詳細信息

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 30
Accepted
time: 19ms
memory: 473216kb

input:

3 4
1 1 1
2 3
1 4
2 2
1 2
3 3

output:

YES
NO
YES
NO

result:

ok 4 token(s): yes count is 2, no count is 2

Test #2:

score: 30
Accepted
time: 12ms
memory: 475124kb

input:

8 5
5 3 4 2 2 6 5 5
1 8
4 5
10 3
11 9
7 2
6 13
14 12
7 3
6 8
4 2
2 5

output:

NO
YES
YES
YES
NO

result:

ok 5 token(s): yes count is 3, no count is 2

Test #3:

score: 30
Accepted
time: 36ms
memory: 476420kb

input:

5 1000
193989534544158 57483670601746 183281373434588 92196008024549 197513473286508
1 5
4 2
7 3
8 6
2 65545142774024
4 67957472319495
5 131478473459166
2 102185858570152
3 191441353035940
5 186000528093501
2 63201184033501
2 77481806092413
3 159789430863849
4 92773786021894
1 194598667478593
3 1458...

output:

YES
YES
YES
NO
NO
NO
NO
NO
NO
YES
YES
YES
YES
YES
YES
YES
YES
NO
NO
YES
YES
YES
YES
YES
YES
NO
NO
NO
NO
YES
NO
YES
YES
YES
YES
YES
YES
NO
NO
NO
NO
YES
YES
YES
NO
NO
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
YES
YES
YES
YES
YES
NO
NO
NO
NO
NO
YES
NO
NO
NO
NO
NO
NO
YES
...

result:

ok 1000 token(s): yes count is 375, no count is 625

Test #4:

score: 30
Accepted
time: 39ms
memory: 477864kb

input:

7 1000
88159166205053 95998544558881 48231159865354 231786835189365 84291070100955 225941839972605 33315221625793
2 5
6 4
7 3
1 10
8 11
9 12
6 150843468162951
2 75759088055460
1 86133344610051
4 140694127444493
1 63070113756930
1 90150689680608
6 147790469610032
7 46561924657801
2 103953340734616
6 ...

output:

NO
NO
NO
NO
NO
NO
NO
NO
YES
NO
NO
NO
NO
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
N...

result:

ok 1000 token(s): yes count is 86, no count is 914

Test #5:

score: 30
Accepted
time: 44ms
memory: 476192kb

input:

7 1000
5 6 7 3 2 5 5
4 7
3 5
1 2
10 6
8 9
12 11
5 2
5 1
5 1
1 2
3 2
5 1
5 2
6 3
4 2
4 1
2 1
5 1
5 1
5 1
7 1
1 2
5 1
5 1
6 3
6 3
5 1
2 2
7 2
7 1
7 1
2 2
1 2
4 2
4 1
1 1
3 1
5 1
2 2
2 2
4 1
2 1
7 2
6 1
2 1
6 2
5 2
1 1
1 1
6 3
7 2
6 3
4 1
1 1
5 1
2 2
7 2
5 1
4 2
5 2
7 2
7 1
4 1
3 2
3 2
1 1
7 2
5 2
1 1
...

output:

NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
NO
YES
YES
YES
YES
NO
YES
NO
YES
YES
YES
YES
YES
YES
NO
NO
NO
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
YES
NO
YES
NO
NO
NO
NO
NO
NO
NO
YES
YES
YES
YES
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO...

result:

ok 1000 token(s): yes count is 199, no count is 801

Test #6:

score: 30
Accepted
time: 36ms
memory: 476368kb

input:

8 1000
172480280419267 212072146993988 23147786306112 161006134777989 37963466387491 50018942108886 18649770050090 50499101532214
7 3
2 1
5 8
9 6
12 11
4 13
10 14
5 57899673021751
7 22087918088240
1 236990257757485
3 21994370580136
7 26427284121647
8 54391900162086
7 27709763713585
6 59631479929866
...

output:

NO
NO
NO
YES
YES
YES
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
NO
NO
NO
NO
NO
NO
NO
NO
YES
NO
YES
NO
NO
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES...

result:

ok 1000 token(s): yes count is 119, no count is 881

Test #7:

score: 30
Accepted
time: 36ms
memory: 477060kb

input:

6 1000
20326746134626 98517002313418 165556087937310 116347939244398 130872245741329 136674587230071
2 3
6 7
8 1
9 5
10 4
4 31902652070998
2 20697837065544
3 14389422108471
5 45879772826060
2 23505088168423
6 7588643182717
2 13873224035289
4 3462171437780
6 12963735380517
6 3348685354818
3 141429739...

output:

NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
NO
NO
NO
NO
NO
NO
NO
NO...

result:

ok 1000 token(s): yes count is 12, no count is 988

Test #8:

score: 0
Wrong Answer
time: 7ms
memory: 472648kb

input:

72 1000
2 10946 610 987 139583862445 20365011074 5 1597 196418 377 267914296 44945570212853 956722026041 5702887 39088169 75025 27777890035288 12586269025 4181 1 53316291173 144 1548008755920 63245986 1 225851433717 6557470319842 832040 2504730781961 102334155 55 3 46368 7778742049 6765 165580141 72...

output:

NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
...

result:

wrong answer expected YES, found NO [1st token]

Subtask #2:

score: 0
Time Limit Exceeded

Test #16:

score: 0
Time Limit Exceeded

input:

10000 10000
85117964119 41472951000 61693640396 66409648221 91978532661 62922448518 92497200794 43837348258 45577855926 38256001396 79446271832 95289903258 62510175551 97599809584 56162244722 87617641117 64010325734 56604859803 58544571483 40687963085 38627694508 64665875035 62273927372 73014847094 ...

output:

YES
YES
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
N...

result:


Subtask #3:

score: 0
Time Limit Exceeded

Test #20:

score: 0
Time Limit Exceeded

input:

50000 50000
16394396247 17456058492 11358090355 13208121167 8612535629 2853817504 18100755237 18603321637 1618810635 7615832530 13631222424 7817630977 10963098997 19654927084 645638016 9352759139 17939720223 15106346489 14475376391 2122412099 15482023637 11224675857 15931143509 4240408932 1270948838...

output:

YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
NO
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO...

result:


Subtask #4:

score: 0
Wrong Answer

Test #24:

score: 0
Wrong Answer
time: 31ms
memory: 473708kb

input:

70 100000
66748 126 1 91045172 3605661959574 274077743637349 147314183 8209537 740253 6920630855 25494 1377240316614 15756 6 108000 18118446805 169389361127761 29316262755 48 2643445763 5834083602536 3 9439745562111 29 3719 10 47434709561 11197815949 6018 325122336074 851181326345 1633739329 1527382...

output:

NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
...

result:

wrong answer expected YES, found NO [1st token]