QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#132403 | #6329. Colorful Graph | UrgantTeam | TL | 569ms | 15604kb | C++23 | 3.5kb | 2023-07-29 20:10:17 | 2023-07-29 20:10:19 |
Judging History
answer
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include<bits/stdc++.h>
using namespace std;
mt19937 rnd(time(0));
int const maxn = 7005;
vector < int > g[maxn], G[maxn], ts, go[maxn], res[2 * maxn];
int used[2 * maxn], cmp, numb[maxn], bad;
vector < int > in[maxn];
bitset < maxn > Gz[maxn];
int one[maxn], two[maxn], out[maxn];
bitset < maxn > free_righ, good;
void answer(int v, int mx, int cmp) {
used[v] = bad;
if (v <= cmp) {
for (auto key : in[v]) out[key] = mx;
}
for (auto key : res[v]) {
if (used[key] != bad) answer(key, mx, cmp);
}
}
void dfs1(int v) {
used[v] = 2, numb[v] = cmp, in[cmp].push_back(v);
for (auto u : g[v]) {
if (used[u] == 1) {
dfs1(u);
} else if (numb[u] != cmp) {
go[cmp].push_back(numb[u]);
}
}
}
void dfs(int v) {
used[v] = 1;
for (auto u : G[v]) if (!used[u]) dfs(u);
ts.push_back(v);
}
void dfs2(int v, int start) {
used[v] = bad;
if (v != start) Gz[start][v] = 1;
for (auto u : go[v]) {
if (used[u] != bad) dfs2(u, start);
}
}
bool calc(int v) {
used[v] = bad;
int pos = (Gz[v]&free_righ)._Find_first();
if (pos <= cmp) {
one[v] = pos, two[pos] = v, free_righ[pos] = 0;
good[v] = 0;
return true;
}
for (int u = Gz[v]._Find_first(); u <= cmp; u = Gz[v]._Find_next(u)) {
if (used[two[u]] != bad && calc(two[u])) {
one[v] = u, two[u] = v;
good[v] = 0;
return true;
}
}
return false;
}
main() {
#ifdef HOME
freopen("input.txt", "r", stdin);
#endif // HOME
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, m, u, v;
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> u >> v;
g[u].push_back(v);
G[v].push_back(u);
}
for (int i = 1; i <= n; i++) if (!used[i]) dfs(i);
reverse(ts.begin(), ts.end());
for (auto key : ts) {
if (used[key] != 2) {
cmp++;
dfs1(key);
}
}
bad = 2;
for (int i = 1; i <= cmp; i++) {
bad++;
dfs2(i, i);
}
int find = 1;
for (int i = 1; i <= cmp; i++) free_righ[i] = 1, good[i] = 1;
vector < int > Q;
for (int i = 1; i <= cmp; i++) {
int ok = 0;
for (int j = 1; j <= cmp; j++) {
if (Gz[i][j] || Gz[j][i]) {
ok = 1;
break;
}
}
if (ok) Q.push_back(i);
}
shuffle(Q.begin(), Q.end(), rnd);
for (auto i : Q) {
for (auto j : Q) {
if (Gz[i][j] && !one[i] && !two[j]) {
one[i] = j, two[j] = i, free_righ[j] = 0, good[i] = 0;
}
}
}
while (find) {
find = 0;
bad++;
for (int i = good._Find_first(); i <= cmp; i = good._Find_next(i)) {
if (calc(i)) {
find = 1, bad++;
}
}
}
int mx = 0;
bad++;
for (int i = 1; i <= cmp; i++) {
if (one[i]) res[i].push_back(one[i] + cmp), res[one[i] + cmp].push_back(i);
res[i].push_back(i + cmp), res[i + cmp].push_back(i);
}
for (int i = 1; i <= cmp; i++) {
if (used[i] != bad) {
mx++;
answer(i, mx, cmp);
}
}
for (int i = 1; i <= n; i++) cout << out[i] << " ";
cout << '\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 6404kb
input:
5 5 1 4 2 3 1 3 2 5 5 1
output:
2 1 2 1 2
result:
ok AC
Test #2:
score: 0
Accepted
time: 1ms
memory: 5776kb
input:
5 7 1 2 2 1 4 3 5 1 5 4 4 1 4 5
output:
2 2 1 1 1
result:
ok AC
Test #3:
score: 0
Accepted
time: 2ms
memory: 4624kb
input:
8 6 6 1 3 4 3 6 2 3 4 1 6 4
output:
4 4 4 4 3 4 2 1
result:
ok AC
Test #4:
score: 0
Accepted
time: 569ms
memory: 15604kb
input:
7000 6999 4365 4296 2980 3141 6820 4995 4781 24 2416 5844 2940 2675 3293 2163 3853 5356 262 6706 1985 1497 5241 3803 353 1624 5838 4708 5452 3019 2029 6161 3849 4219 1095 1453 4268 4567 1184 1857 2911 3977 1662 2751 6353 6496 2002 6628 1407 4623 425 1331 4445 4277 1259 3165 4994 1044 2756 5788 5496 ...
output:
1506 516 349 1407 952 53 1739 900 1257 1750 791 1041 1277 791 414 1435 1749 1053 1526 1748 1747 1747 1471 1469 924 803 1099 981 146 1149 1746 106 168 473 936 595 1745 1557 629 1361 1744 985 1554 1743 668 1742 448 1558 96 24 1235 1275 1741 1077 1359 1740 1190 94 1739 1439 1385 155 1496 775 1738 1137 ...
result:
ok AC
Test #5:
score: 0
Accepted
time: 376ms
memory: 15576kb
input:
7000 6999 4832 1603 5984 6985 5355 3687 6007 2170 5984 3486 3267 2189 538 2123 4343 4553 5855 6168 5984 257 4239 2304 5984 2063 3298 1869 5984 6353 5984 2018 5984 5387 5984 3382 3164 3978 2690 2816 4810 2638 5984 3773 5984 1634 5984 2786 5984 3671 5984 5140 2943 5721 5984 414 1105 4060 3093 796 5984...
output:
1461 656 2333 2332 2331 131 2330 2329 1594 1183 2250 12 853 2328 917 1043 1725 2042 1153 2327 2184 2326 2325 2324 2132 55 2323 2322 2321 2320 2319 18 922 1492 2081 1170 2318 69 2317 2316 86 2315 2314 411 2313 294 2312 1993 314 2311 2310 2309 2308 2307 2306 1489 2026 1145 569 344 233 1537 1390 1674 2...
result:
ok AC
Test #6:
score: 0
Accepted
time: 191ms
memory: 10788kb
input:
7000 6999 1649 5337 1701 3344 4394 2172 3330 39 5932 1141 5381 5340 5453 3300 125 2172 6810 5263 804 2172 6635 2172 676 4740 3015 1183 1710 5769 611 5915 3419 1581 2094 2172 4508 2172 6604 2433 6113 1466 1604 696 1518 1123 1287 2940 4825 2172 5130 4524 2693 2172 106 2172 5157 2172 3693 2172 5198 217...
output:
946 2048 2333 2332 2155 1107 2331 2330 2329 1464 68 320 1841 1672 711 2328 58 2327 2326 2325 1039 169 1496 2324 905 2323 1062 2322 1771 335 2321 1761 2320 2171 2319 220 30 2318 2317 213 1961 2316 2315 1937 963 2002 2330 2314 539 716 2313 745 2312 2311 394 2310 1788 685 2309 908 1282 278 790 2308 230...
result:
ok AC
Test #7:
score: 0
Accepted
time: 212ms
memory: 11624kb
input:
7000 6999 2896 6321 881 2623 5058 2623 4833 2623 4669 2623 4781 5007 1447 2623 4781 4768 4781 3834 2758 4792 797 5055 3784 2623 4781 5510 6606 3040 597 3459 4136 2037 1291 3989 4781 837 4781 4379 5637 2053 1642 2665 4781 4664 4781 952 4924 2511 4781 4201 4781 2352 4781 5362 3901 197 137 2623 2706 19...
output:
657 553 846 1460 1474 1526 1072 367 1750 540 609 1361 1563 1673 703 1749 1748 1009 222 182 1747 536 1746 1745 1744 1743 1742 1741 730 659 941 925 1597 864 749 995 1740 1739 695 1738 929 1163 1737 700 650 430 1022 856 79 1621 1091 13 733 1393 1518 19 1513 1321 1736 691 1493 1159 1563 1735 1338 1637 1...
result:
ok AC
Test #8:
score: 0
Accepted
time: 75ms
memory: 10492kb
input:
6999 6998 1269 3969 1269 2429 1269 2609 1269 2515 1269 6166 1269 6614 3108 1269 2105 1269 4670 1269 578 1269 4661 1269 1421 1269 2576 1269 6152 1269 1269 6636 3011 1269 305 1269 5189 1269 1683 1269 6861 1269 1269 5798 1499 1269 282 1269 914 1269 80 1269 677 1269 701 1269 1269 359 6521 1269 1269 1754...
output:
3237 751 3476 2952 3499 1061 445 3498 3497 3496 3495 3494 1472 3493 14 1618 1234 3492 2017 3487 3491 467 2799 3490 1248 246 912 85 1799 3489 3008 3488 2619 67 3487 1736 3486 3485 674 3484 3483 2946 177 3482 3481 417 2924 3303 354 1584 3480 3479 3478 540 3477 3476 1858 3185 2630 1087 2131 3475 3474 1...
result:
ok AC
Test #9:
score: 0
Accepted
time: 37ms
memory: 5340kb
input:
7000 0
output:
7000 6999 6998 6997 6996 6995 6994 6993 6992 6991 6990 6989 6988 6987 6986 6985 6984 6983 6982 6981 6980 6979 6978 6977 6976 6975 6974 6973 6972 6971 6970 6969 6968 6967 6966 6965 6964 6963 6962 6961 6960 6959 6958 6957 6956 6955 6954 6953 6952 6951 6950 6949 6948 6947 6946 6945 6944 6943 6942 6941 ...
result:
ok AC
Test #10:
score: -100
Time Limit Exceeded
input:
7000 6999 3138 1903 3285 5919 6182 1430 1164 961 1577 6445 1390 3384 935 5723 6614 6387 4799 2877 3915 5128 5366 5455 2287 3941 2053 2326 4022 6993 488 2922 4327 4701 4674 3221 1666 4773 4356 3232 3888 937 4318 6942 577 1299 4491 1938 5154 1254 790 5532 4286 5478 2918 6725 2853 304 2554 5207 5140 77...