QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#117492#1878. No Rest for the WickedLinsheyWA 13ms93812kbC++143.2kb2023-07-01 13:49:262023-07-01 13:49:29

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 13:49:29]
  • 评测
  • 测评结果:WA
  • 用时:13ms
  • 内存:93812kb
  • [2023-07-01 13:49:26]
  • 提交

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'