QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#117485#1878. No Rest for the WickedLinsheyML 3ms15928kbC++142.9kb2023-07-01 12:54:092023-07-01 12:54:56

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-01 12:54:56]
  • 评测
  • 测评结果:ML
  • 用时:3ms
  • 内存:15928kb
  • [2023-07-01 12:54:09]
  • 提交

answer


#include <bits/stdc++.h>

using namespace std; const int maxn = 2e5 + 5;

struct node { int s, ls, rs, fa; } tr[30000007]; int tt;

inline void pushup(int u)
{
    tr[u].s = 0;
    if (tr[u].ls) tr[u].s = max(tr[u].s, tr[tr[u].ls].s), tr[tr[u].ls].fa = u;
    if (tr[u].rs) tr[u].s = max(tr[u].s, tr[tr[u].rs].s), tr[tr[u].rs].fa = u;
}

int make(int u, int l, int r, int p, int k)
{
    if (l == r) { tr[u].s = k; return u; }
    int mid = l + r >> 1, res;
    if (p <= mid) res = make(tr[u].ls = ++tt, l, mid, p, k);
    else res = make(tr[u].rs = ++tt, mid + 1, r, p, k); pushup(u); return res;
}

int merge(int u, int v, int l, int r)
{
    if (!u || !v) return u | v;
    assert(l != r);
    int mid = l + r >> 1;
    tr[u].ls = merge(tr[u].ls, tr[v].ls, l, mid);
    tr[u].rs = merge(tr[u].rs, tr[v].rs, mid + 1, r);
    pushup(u);
    return u;
}

void split(int u, int l, int r, int &x, int &y, int k)
{
    if (k >= r) { x = u; return; }
    if (k < l) { y = u; return; }
    x = ++tt, y = ++tt; int mid = l + r >> 1;
    if (k <= mid) tr[y].rs = tr[u].rs, split(tr[u].ls, l, mid, tr[x].ls, tr[y].ls, k);
    else tr[x].ls = tr[u].ls, split(tr[u].rs, mid + 1, r, tr[x].rs, tr[y].rs, k);
    pushup(x), pushup(y);
}

inline int find(int u) { while (tr[u].fa) u = tr[u].fa; return u; }

inline void edit(int u, int k) { tr[u].s = k; while (tr[u].fa) pushup(u = tr[u].fa); }

int n, m, c[maxn], t[maxn], s[maxn], p[maxn], q[maxn];

vector<int> T[maxn];

int ans[maxn];

bool is[maxn]; int pos[maxn], df[maxn], dt, fa[maxn];

void dfs(int u, int fa)
{
    df[u] = ++dt, ::fa[u] = fa;
    for (int v : T[u]) if (v != fa) dfs(v, u);
}

inline void insert(int u)
{
    assert(is[u] == 0);
    is[u] = 1;
    for (int v : T[u]) if (is[v]) merge(find(pos[u]), find(pos[v]), 1, n);
}

inline void erase(int u)
{
    assert(is[u] == 1);
    is[u] = 0;
    int tx, ty;
    split(find(pos[u]), 1, n, tx, ty, df[u] - 1);
    for (int v : T[u]) if (v != fa[u] && is[v]) split(find(pos[u]), 1, n, tx, ty, df[v] - 1);
    for (int v : T[u]) if (is[v]) edit(pos[v], s[v] = max(s[v], s[u]));
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) scanf("%d%d%d", c + i, t + i, s + i);
    for (int i = 1, u, v; i < n; i++) scanf("%d%d", &u, &v), T[u].push_back(v), T[v].push_back(u);
    dfs(1, 0);
    for (int i = 1; i <= n; i++) pos[i] = make(++tt, 1, n, df[i], s[i]);
    for (int i = 1; i <= n; i++) p[i] = i; sort(p + 1, p + n + 1, [](int x, int y) { return c[x] < c[y]; });
    for (int i = 1; i <= n; i++) q[i] = i; sort(q + 1, q + n + 1, [](int x, int y) { return t[x] < t[y]; });
    for (int i = n, j = n; i; i--)
    {
        while (j >= 1 && t[q[j]] >= c[p[i]]) insert(q[j--]);
        ans[p[i]] = tr[find(pos[p[i]])].s;
        erase(p[i]);
    }
    for (int i = 1; i <= n; i++) printf("%d ", ans[i]); puts("");
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 3ms
memory: 15928kb

input:

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

output:

2 4 2 3 

result:

ok 4 number(s): "2 4 2 3"

Test #2:

score: 0
Accepted
time: 3ms
memory: 13892kb

input:

1 0
138088047 507565360 682493255

output:

682493255 

result:

ok 1 number(s): "682493255"

Test #3:

score: -100
Memory Limit Exceeded

input:

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

output:


result: