UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#198605#2967. Graphtkswls10010574ms36912kbC++112.9kb2023-11-28 09:32:312023-11-28 12:09:34

answer

#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int fa[200005], n, m, u[200005], v[200005];
long long w[200005], a[200005], sum[200005];
priority_queue<int, vector<int>, greater<int>> que;
set<pair<int, int>> s[200005];
inline int finds(int p) {
	return (fa[p] == p) ? p : (fa[p] = finds(fa[p]));
}
inline int grand(int l, int r) {
	return rand() % (r - l + 1) + l;
}
set<pair<int, int>>::iterator it;
signed main() {
//	ios::sync_with_stdio(0);
///	cin.tie(0);
//	cout.tie(0);
	srand((unsigned int)time(0));
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		fa[i] = i;
	}
	for (int i = 1; i <= m; i++) {
		cin >> u[i] >> v[i] >> w[i];
		sum[i] = w[i] - a[u[i]] - a[v[i]];
//		cout << sum[i] << "||";
		if (sum[i] <= 0) {
			que.push(i);
			continue;
		}
		int op = sum[i] / 2;
		s[u[i]].insert(make_pair(a[u[i]] + op, i));
		s[v[i]].insert(make_pair(a[v[i]] + sum[i] - op, i));
	}
	while (que.size()) {
		int op = que.top();
		que.pop();
		if (finds(u[op]) == finds(v[op])) continue;
		cout << op << " ";
		int p = finds(u[op]), q = finds(v[op]), uu, vv, ww;
		if (s[p].size() < s[q].size()) swap(p, q);
		for (auto i : s[q]) {
			s[p].insert(i);
		}
		s[q].clear();
		fa[q] = p;
		a[p] += a[q];
		if (s[p].size()) {
			it = s[p].begin();
			while (s[p].size() && (*s[p].begin()).first <= a[p]) {
				op = (*s[p].begin()).second;
				uu = finds(u[op]), vv = finds(v[op]);
				if (uu == vv) {
					ww = w[op] - (*s[p].begin()).first;
					s[p].erase(s[p].begin());
					s[vv].erase(make_pair(ww, op));
					continue;
				}
				if (vv == p) swap(uu, vv);
				ww = w[op] - (*s[p].begin()).first;
//				cout << ww << " " << w[op] << ' ' << (*s[p].begin()).first << " " << a[uu] << " '" << a[vv] << "\n";
				s[p].erase(s[p].begin());
				s[vv].erase(make_pair(ww, op));
				if (a[p] + a[vv] >= w[op]) {
					que.push(op);
				} else {
					sum[op] = w[op] - a[uu] - a[vv];
//					cout << sum[op] << "|" << a[p] + (sum[op] * 3 + 3) / 4 << "##" << w[op] - (a[p] + (sum[op] * 3 + 3) / 4) << "\n";
					s[p].insert(make_pair(a[p] + (sum[op] * 3 + 3) / 4, op));
					s[vv].insert(make_pair(w[op] - (a[p] + (sum[op] * 3 + 3) / 4), op));
				}
			}
		}
	}
}
//复杂度相当于每次启发式合并多做一次?
//应该不会高于n(logn)^2吧,m摆在这肯定到不了n^2肯定到不了n^2肯定到不了n^2肯定到不了n^2肯定到不了n^2肯定到不了n^2肯定到不了n^2
//别被卡常

//所以我还真不知道set erase后迭代器会怎么变化
//cnm,又得想了

//有个乱搞的做法
//可惜有subtask
//没事,信仰随机化,感觉不能太大也不能太小,就取w/4-3w/4

//能过能过能过能过能过能过能过能过能过能过能过能过能过能过能过能过
//能过能过能过能过能过能过能过能过

//好像要是定值
// 直接取3/4,虽然感觉越大越快,但是太大好像也不行

Details

小提示:点击横条可展开更详细的信息

Subtask #1:

score: 15
Accepted

Test #1:

score: 15
Accepted
time: 11ms
memory: 11212kb

input:

5000 5000
1123 163175 169438 94211 73801 57442 90671 119541 118235 173859 144066 161573 124203 14400...

output:

2 8 16 20 22 24 27 31 34 36 47 54 69 75 77 79 84 92 96 104 107 108 113 115 120 121 125 126 130 131 1...

result:

ok 2500 tokens

Test #2:

score: 0
Accepted
time: 11ms
memory: 11204kb

input:

5000 5000
142694 87982 154224 118066 63147 16328 107022 13653 138464 52796 133066 194640 29797 10605...

output:

14 15 16 17 20 27 33 37 38 43 44 47 49 62 64 67 74 81 84 91 113 117 127 129 134 139 140 142 146 150 ...

result:

ok 3000 tokens

Test #3:

score: 0
Accepted
time: 9ms
memory: 11200kb

input:

5000 5000
128235 2083 6026 47696 135635 98175 48900 76560 6750 184539 17539 68000 119652 112347 2884...

output:

4 5 6 10 11 13 14 15 26 28 39 46 50 52 53 61 64 67 74 79 81 83 87 89 93 94 103 105 109 112 116 120 1...

result:

ok 3500 tokens

Test #4:

score: 0
Accepted
time: 9ms
memory: 11200kb

input:

5000 5000
162363 135175 7146 131247 155338 141532 174511 146133 17456 163104 63171 103504 81418 1851...

output:

4 13 25 29 30 33 34 35 38 48 49 50 54 56 60 79 86 92 95 98 101 103 106 108 110 117 118 120 125 131 8...

result:

ok 4000 tokens

Test #5:

score: 0
Accepted
time: 17ms
memory: 11196kb

input:

5000 5000
189136 141781 34556 46366 3707 156659 100475 147974 66348 99242 156642 16819 2948 134536 1...

output:

4 10 12 13 15 17 18 19 21 22 24 27 33 36 37 39 41 44 45 54 57 61 66 67 69 70 76 81 82 92 99 108 120 ...

result:

ok 4500 tokens

Subtask #2:

score: 30
Accepted

Test #6:

score: 30
Accepted
time: 523ms
memory: 34052kb

input:

5000 200000
174732 140018 90060 781 33775 180918 184425 26093 32925 33534 58362 94298 98994 194690 1...

output:

31 67 874 927 1627 1702 1728 1830 1842 1909 2228 2240 2515 2810 2932 3113 3161 3267 3286 3311 3476 4...

result:

ok 2500 tokens

Test #7:

score: 0
Accepted
time: 543ms
memory: 34140kb

input:

5000 200000
162952 170513 181140 127011 125787 119196 39577 64608 27871 149143 158172 45177 59202 11...

output:

3 187 267 687 814 864 1037 1130 1173 1509 1632 1854 1938 2037 2646 2951 3051 3323 3489 3616 3709 372...

result:

ok 3000 tokens

Test #8:

score: 0
Accepted
time: 565ms
memory: 34036kb

input:

5000 200000
82875 187474 13223 113403 31329 155714 39478 104061 83801 115210 185045 67820 16716 9026...

output:

44 152 331 488 589 593 601 831 887 1323 1391 1414 1683 1786 1794 1952 2091 2102 2104 2187 2320 2328 ...

result:

ok 3500 tokens

Test #9:

score: 0
Accepted
time: 610ms
memory: 34036kb

input:

5000 200000
170133 59925 108865 52111 129750 38364 29535 125859 93150 126221 163869 15502 50272 1626...

output:

2 609 693 781 808 835 952 985 1001 1226 1565 1666 1733 2017 2025 2386 2420 2494 2522 2564 2670 2724 ...

result:

ok 4000 tokens

Test #10:

score: 0
Accepted
time: 762ms
memory: 36912kb

input:

5000 200000
86471 181602 105988 136644 30050 155404 198977 33655 109906 86580 37106 68256 34741 1888...

output:

118 168 439 495 652 1216 1516 1854 1932 1977 1991 2238 2619 2637 2855 2888 3236 3327 3345 3522 3627 ...

result:

ok 4500 tokens

Subtask #3:

score: 25
Accepted

Test #11:

score: 25
Accepted
time: 223ms
memory: 21396kb

input:

100000 100000
1259 2935 988 8432 9829 7604 4889 4916 5453 4097 9642 8092 4213 2338 1357 9755 824 293...

output:

2 4 5 6 14 17 20 25 26 28 37 43 44 49 52 66 72 80 82 84 86 88 93 96 97 99 106 113 124 130 131 133 13...

result:

ok 50000 tokens

Test #12:

score: 0
Accepted
time: 206ms
memory: 21392kb

input:

100000 100000
2498 4986 3852 2272 3942 5923 2029 7288 303 9951 4015 3853 4440 5213 8866 807 8109 786...

output:

3 13 15 17 21 25 26 27 29 33 37 40 43 45 46 48 49 50 51 53 54 58 60 65 74 79 80 84 86 87 90 102 103 ...

result:

ok 55000 tokens

Test #13:

score: 0
Accepted
time: 216ms
memory: 21272kb

input:

100000 100000
7644 5722 6013 7665 9948 6220 2400 2451 5468 5032 5268 5001 6014 8528 5378 2254 4652 3...

output:

3 4 6 10 13 20 21 24 34 42 48 54 55 60 61 62 72 75 80 81 86 94 95 98 100 102 103 107 116 120 126 140...

result:

ok 60000 tokens

Test #14:

score: 0
Accepted
time: 218ms
memory: 21228kb

input:

100000 100000
2399 8351 6574 9119 8140 2124 7360 8453 5098 1817 4747 5222 8438 8967 8718 8357 7246 8...

output:

4 5 8 15 17 20 21 22 23 27 39 42 47 56 60 62 64 66 67 69 72 74 79 82 89 92 93 96 102 107 111 123 124...

result:

ok 65000 tokens

Test #15:

score: 0
Accepted
time: 223ms
memory: 21184kb

input:

100000 100000
4550 385 2674 7841 9597 5168 5458 3758 4210 3753 85 5550 6775 5653 6645 8960 3492 2767...

output:

1 2 6 9 12 13 26 28 32 37 38 39 50 53 55 62 65 68 69 70 72 76 80 82 84 90 91 92 97 100 105 119 123 1...

result:

ok 70000 tokens

Test #16:

score: 0
Accepted
time: 218ms
memory: 21156kb

input:

100000 100000
8535 1202 8257 1456 8117 1995 4315 4859 9864 8425 1745 494 8040 1736 6677 854 8277 250...

output:

3 4 8 11 16 20 28 29 32 40 43 44 46 60 71 75 79 80 83 84 87 93 96 97 98 107 109 110 112 117 118 119 ...

result:

ok 75000 tokens

Test #17:

score: 0
Accepted
time: 242ms
memory: 21132kb

input:

100000 100000
677 5086 4827 2677 4528 7715 9370 4639 1762 4404 8570 6234 676 9085 8500 7357 2959 289...

output:

1 7 8 15 20 24 34 37 43 46 47 52 53 59 61 64 73 75 80 82 88 92 93 95 101 102 103 105 122 129 142 147...

result:

ok 80000 tokens

Test #18:

score: 0
Accepted
time: 258ms
memory: 21128kb

input:

100000 100000
5533 4431 3393 9599 5051 9970 664 9291 6307 3345 4254 7549 2679 5240 4001 3205 3342 19...

output:

1 7 18 24 27 39 47 48 51 58 64 65 67 68 69 92 98 106 108 112 114 119 121 122 128 129 131 132 133 145...

result:

ok 85000 tokens

Test #19:

score: 0
Accepted
time: 259ms
memory: 21128kb

input:

100000 100000
6109 8952 4194 7341 9364 8964 4731 2622 9159 3261 4057 4193 3138 6641 178 9185 2859 38...

output:

1 8 11 12 13 16 20 22 26 32 36 38 42 45 65 67 68 72 74 75 77 78 80 81 82 87 90 91 96 109 110 111 112...

result:

ok 90000 tokens

Test #20:

score: 0
Accepted
time: 270ms
memory: 21128kb

input:

100000 100000
8638 1720 3229 554 2786 9956 8425 1561 4560 5585 5602 3011 7401 8102 4705 9065 4415 66...

output:

1 7 10 18 19 24 30 32 37 49 55 64 70 75 83 85 88 89 91 92 93 100 106 107 110 111 118 123 124 127 130...

result:

ok 95000 tokens

Subtask #4:

score: 30
Accepted

Test #21:

score: 30
Accepted
time: 439ms
memory: 32296kb

input:

200000 200000
1439 3073 717 1053 2948 1486 709 3039 773 745 3834 3303 2853 3162 3620 1891 4173 20 52...

output:

1 8 14 15 20 28 29 30 32 36 42 46 49 67 68 69 72 76 77 81 84 91 97 100 117 121 124 128 143 144 148 1...

result:

ok 100000 tokens

Test #22:

score: 0
Accepted
time: 457ms
memory: 32012kb

input:

200000 200000
2638 1629 2202 4870 3507 1930 4333 513 1683 2885 1723 1804 93 1536 3379 1452 2992 3463...

output:

1 13 14 16 26 35 36 38 41 43 46 49 59 63 65 66 80 83 87 88 94 97 99 101 113 114 119 121 128 130 134 ...

result:

ok 110000 tokens

Test #23:

score: 0
Accepted
time: 492ms
memory: 31960kb

input:

200000 200000
164 741 482 4685 4106 2045 1257 4091 2479 3454 4114 191 1734 1295 1724 3470 4268 276 4...

output:

1 5 7 13 16 18 22 25 26 36 37 42 46 50 60 63 65 71 72 77 81 83 87 88 89 92 93 94 108 112 113 115 125...

result:

ok 120000 tokens

Test #24:

score: 0
Accepted
time: 494ms
memory: 31924kb

input:

200000 200000
3836 4604 351 3233 295 1748 2314 1643 4055 3897 4690 2240 3796 2091 47 3199 3860 4018 ...

output:

2 5 9 10 12 14 17 18 25 27 29 30 33 35 36 39 41 42 47 49 54 55 58 60 62 63 69 70 74 76 77 78 79 86 9...

result:

ok 130000 tokens

Test #25:

score: 0
Accepted
time: 502ms
memory: 31896kb

input:

200000 200000
4905 4052 4126 996 4563 998 89 4747 3959 3514 4113 3470 282 4357 3936 1103 4944 3030 2...

output:

9 14 21 23 27 28 32 33 38 43 46 50 56 63 70 73 79 80 86 98 105 108 116 129 130 140 142 144 145 150 1...

result:

ok 140000 tokens

Test #26:

score: 0
Accepted
time: 517ms
memory: 31640kb

input:

200000 200000
1483 1956 3481 1944 426 1316 2641 1748 4138 4525 2668 3641 2866 4679 3779 4443 1718 35...

output:

2 9 17 23 24 26 29 30 35 37 40 48 49 50 59 61 75 82 88 90 91 95 96 97 98 106 107 108 117 122 132 136...

result:

ok 150000 tokens

Test #27:

score: 0
Accepted
time: 552ms
memory: 31760kb

input:

200000 200000
955 4322 2789 1469 3037 827 1461 2872 1365 3463 548 4454 4427 2952 3140 1870 1140 903 ...

output:

5 9 13 15 18 23 24 26 28 32 33 35 40 41 42 48 50 54 57 65 66 68 72 74 78 79 82 88 91 93 97 98 100 10...

result:

ok 160000 tokens

Test #28:

score: 0
Accepted
time: 541ms
memory: 31580kb

input:

200000 200000
2566 2559 4787 435 2117 4905 3172 4488 250 4413 4667 1001 1138 1000 259 192 1141 1618 ...

output:

11 13 16 17 20 23 26 30 31 36 43 49 52 57 61 62 63 68 70 73 75 78 90 92 97 112 114 119 122 123 126 1...

result:

ok 170000 tokens

Test #29:

score: 0
Accepted
time: 580ms
memory: 31548kb

input:

200000 200000
1722 1628 4209 3734 1634 4620 1267 2414 1148 4437 3834 1662 2662 2421 1858 3597 2857 3...

output:

4 5 6 8 10 23 24 29 35 38 39 40 43 45 52 54 55 59 60 65 72 79 80 81 83 86 91 93 94 96 98 100 103 104...

result:

ok 180000 tokens

Test #30:

score: 0
Accepted
time: 607ms
memory: 31512kb

input:

200000 200000
3677 425 955 1897 2069 2033 4173 1345 4199 3718 2733 2019 3352 2968 1560 5 1746 325 1 ...

output:

3 4 8 19 20 27 32 35 41 43 48 50 56 58 69 70 73 81 84 91 93 97 101 102 105 106 110 114 125 126 127 1...

result:

ok 190000 tokens

Extra Test:

score: 0
Extra Test Passed