QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#117492 | #1878. No Rest for the Wicked | Linshey | WA | 13ms | 93812kb | C++14 | 3.2kb | 2023-07-01 13:49:26 | 2023-07-01 13:49:29 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std; const int maxn = 4e5 + 5;
struct node { int s, fa, sz; multiset<int> ss; } tr[maxn];
inline void mt(int u) { assert(tr[u].ss.size()), tr[u].s = *tr[u].ss.rbegin(); }
pair<int, int> op[maxn]; int tt;
inline void merge(int u, int v)
{
if (tr[u].sz > tr[v].sz) swap(u, v);
op[++tt] = { u, v };
tr[u].fa = v;
tr[v].sz += tr[u].sz;
tr[v].ss.insert(tr[u].s);
mt(v);
}
inline void back()
{
int u, v;
tie(u, v) = op[tt--];
tr[u].fa = 0;
tr[v].sz -= tr[u].sz;
tr[v].ss.erase(tr[v].ss.lower_bound(tr[u].s));
mt(v);
}
inline int find(int u) { while (tr[u].fa) u = tr[u].fa; return u; }
inline void edit(int u, int d, int k)
{
while (u && d < k)
{
int nd = tr[u].s;
tr[u].ss.erase(tr[u].ss.lower_bound(d));
tr[u].ss.insert(k);
int nk = tr[u].s = *tr[u].ss.rbegin();
d = nd, k = nk, u = tr[u].fa;
}
}
int n, m, c[maxn], t[maxn], s[maxn], ans[maxn];
vector<int> G[maxn];
int lis[maxn], tl;
vector<int> tg[maxn << 2], Tg[maxn];
void insert(int u, int l, int r, int ul, int ur, int k)
{
if (ul <= l && r <= ur) { tg[u].push_back(k); return; } int mid = l + r >> 1;
if (ul <= mid) insert(u << 1, l, mid, ul, ur, k); if (ur > mid) insert(u << 1 | 1, mid + 1, r, ul, ur, k);
}
bool is[maxn];
void solve(int u, int l, int r)
{
// cerr << "solve: " << u << ' ' << l << ' ' << r << endl;
int lt = tt;
for (int x : tg[u])
{
assert(is[x] == 0);
is[x] = 1;
for (int y : G[x]) if (is[y])
{
int X = find(x), Y = find(y);
// cerr << "merge: " << x << ' ' << y << endl;
if (X != Y) merge(X, Y);
}
}
if (l == r)
for (int x : Tg[l])
{
// cerr << "ans: " << x << ' ' << tr[find(x)].s << endl;
// exit(0);
ans[x] = tr[find(x)].s;
for (int y : G[x])
{
if (ans[x] < s[y])
{
edit(y, s[y], ans[x]);
s[y] = ans[x];
}
}
}
else
{
int mid = l + r >> 1;
solve(u << 1 | 1, mid + 1, r);
solve(u << 1, l, mid);
}
while (tt > lt) back();
for (int x : tg[u])
{
assert(is[x] == 1);
is[x] = 0;
}
}
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 <= m; i++) scanf("%d%d", &u, &v), G[u].push_back(v), G[v].push_back(u);
for (int i = 1; i <= n; i++) lis[++tl] = c[i], lis[++tl] = t[i];
sort(lis + 1, lis + tl + 1);
for (int i = 1; i <= n; i++) c[i] = lower_bound(lis + 1, lis + tl + 1, c[i]) - lis;
for (int i = 1; i <= n; i++) t[i] = lower_bound(lis + 1, lis + tl + 1, t[i]) - lis;
for (int i = 1; i <= n; i++) tr[i] = { s[i], 0, 1, { s[i] } };
for (int i = 1; i <= n; i++) insert(1, 1, tl, c[i], t[i], i);
for (int i = 1; i <= n; i++) Tg[c[i]].push_back(i);
// for (int i = 1; i <= n; i++) cerr << c[i] << ' ' << t[i] << endl;
solve(1, 1, tl);
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: 13ms
memory: 93812kb
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: 10ms
memory: 93784kb
input:
1 0 138088047 507565360 682493255
output:
682493255
result:
ok 1 number(s): "682493255"
Test #3:
score: -100
Wrong Answer
time: 3ms
memory: 93784kb
input:
4 4 1 4 3 2 4 2 2 4 3 3 4 4 1 2 1 3 2 3 3 4
output:
3 3 3 4
result:
wrong answer 1st numbers differ - expected: '4', found: '3'