QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#5024#460. Colored GraphLenstar0 0ms0kbC++112.3kb2020-10-20 14:37:042021-12-19 05:44:03

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2021-12-19 05:44:03]
  • 评测
  • 测评结果:0
  • 用时:0ms
  • 内存:0kb
  • [2020-10-20 14:37:04]
  • 提交

answer

#include <bits/stdc++.h>

const int N = 5e5 + 10;
using pii = std::pair<int, int>;
using sit = std::set<int>::iterator;
#define mkp(a, b) std::make_pair(a, b)

inline int read()
{
    int x = 0;
    char ch = getchar();
    while (!isdigit(ch)) ch = getchar();
    while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
    return x;
}

std::map<pii, int> Map;
long long X, Y, Z, P[N];
pii ans[N];
int cnt = 0;
std::set<int> A, B;

inline int calc(int u, int v)
{
    return (X * std::min(u, v) + Y * std::max(u, v)) % Z >= P[u] + P[v];
}

inline int Ask(int u, int v)
{
    if (u > v) std::swap(u, v);
    return Map.count(mkp(u, v)) ? Map[mkp(u, v)] : calc(u, v);
}

inline int pre(int u)
{
    sit it = A.lower_bound(u); 
    if (it == A.begin()) it = A.end();
    return *--it;
}

inline int suf(int u)
{
    sit it = A.upper_bound(u);
    if (it == A.end()) it = A.begin();
    return *it;
}

inline void upd(int u)
{
    int p = pre(u), s = suf(u);
    if (Ask(u, p) != Ask(u, s)) B.insert(u);
    else if (B.find(u) != B.end()) B.erase(u);
}

inline int solve()
{
    if (B.empty())
    {
        sit it1 = A.begin(), it2 = it1; 
        int col = Ask(*it1, *++it2);
        for (; it2 != A.end(); it1 = it2++)
            ans[++cnt] = mkp(*it1, *it2);
        return col;
    }
    int u = *B.begin(), p = pre(u), s = suf(u);
    int col1 = Ask(u, p), col2 = Ask(u, s);
    A.erase(u), B.erase(B.begin()), upd(p), upd(s);
    int col = solve();
    ans[++cnt] = mkp(u, col1 == col ? p : s);
    return col;
}

int main()
{
    int n = read(), m = read();
    for (int i = 1; i <= m; ++i)
    {
        int u = read(), v = read();
        if (u > v) std::swap(u, v);
        Map[mkp(u, v)] = read();
    }
    X = read(), Y = read(), Z = read();
    for (int i = 1; i <= n; ++i) P[i] = read();
    // for (int i = 1; i <= n; ++i) suf[i] = i + 1, pre[i] = i - 1;
    // pre[1] = n, suf[n] = 1;
    // for (int i = 1; i <= n; ++i)
    //     for (int j = i + 1; j <= n; ++j)
    //         printf("%d %d %d\n", i, j, Ask(i, j));
    // for (int i = 1; i <= n; ++i) A.insert(i);
    for (int i = 1; i <= n; ++i) upd(i);
    solve();
    for (int i = 1; i <= cnt; ++i) printf("%d %d\n", ans[i].first, ans[i].second);
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Runtime Error

input:

439947
70564
261418 81226 0
391157 185738 1
291864 124280 1
224287 253065 0
254187 331805 1
93992 112583 0
3774 31281 1
413605 291199 1
123118 278877 0
383287 374927 0
219696 430048 1
374944 272292 0
156453 15904 0
13652 163529 1
291676 57172 1
268448 195409 0
242654 300684 1
174795 208807 1
216759 123623 1
254209 264578 1
407424 172906 0
21164 297845 1
111755 149875 1
203860 424465 1
275710 160996 0
365668 371841 0
429822 241152 0
275198 109336 1
66424 251337 0
113416 5400 0
297211 370277 1
169...

output:


result: