QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#5024 | #460. Colored Graph | Lenstar | 0 | 0ms | 0kb | C++11 | 2.3kb | 2020-10-20 14:37:04 | 2021-12-19 05:44:03 |
Judging History
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;
}
详细
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...