QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#117485 | #1878. No Rest for the Wicked | Linshey | ML | 3ms | 15928kb | C++14 | 2.9kb | 2023-07-01 12:54:09 | 2023-07-01 12:54:56 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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