QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#560370#7343. Bicycle Racebad_solverWA 6ms9648kbC++233.1kb2024-09-12 15:22:402024-09-12 15:22:41

Judging History

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

  • [2024-09-12 15:22:41]
  • 评测
  • 测评结果:WA
  • 用时:6ms
  • 内存:9648kb
  • [2024-09-12 15:22:40]
  • 提交

answer

#include <bits/stdc++.h>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define f first
#define s second
using namespace std;
using ll = long long;
using pii = pair <int, int>;
const int N = 1e5 + 3, K = 317;
int n, m, s[N * 2];
unordered_map <int, int> g[N];
void upd(int pos, int val, int max_range) {
	for (s[pos += max_range] = val; pos /= 2;)
		s[pos] = max(s[pos * 2], s[pos * 2 + 1]);
}
int get(int b, int e, int max_range) {
	++e;
	int ra = 0, rb = 0;
	for (b += max_range, e += max_range; b < e; b /= 2, e /= 2) {
		if (b % 2) ra = max(ra, s[b++]);
		if (e % 2) rb = max(s[--e], rb);
	}
	return max(ra, rb);
}
int main() {
	ios :: sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m;
	vector <pii> edges;
	for (int i = 1; i <= m; ++i) {
		int u, v, w;
		cin >> u >> v >> w;
		edges.pb({u, v});
		g[u][v] = g[v][u] = w;
	}
	// fix a host
	int ans = 0;
	for (int v = 1; v <= n; ++v) {
		if (sz(g[v]) < 4)
			continue;
		if (sz(g[v]) <= K) {
			vector <pii> nodes;
			for (auto x : g[v]) 
				nodes.pb(x);
			sort(all(nodes));
			vector <pair <pii, int> > vec;
			for (int i = 0; i < sz(nodes); ++i) {
				auto [u1, w1] = nodes[i];
				for (int j = 0; j < i; ++j) {
					auto [u2, w2] = nodes[j];
					if (g[u1].count(u2)) {
						int tot = w1 + w2 + g[u1][u2];
						vec.pb({{i, j}, tot});
					}
				}
			}
			reverse(all(vec));
			for (int i = 0; i <= sz(nodes) * 2; ++i)
				s[i] = 0;
			for (int i = 0; i < sz(vec); ++i) {
				int j = i;
				while (j + 1 < sz(vec) && vec[j + 1].f.f == vec[j].f.f)
					++j;
				for (int k = i; k <= j; ++k) {
					int ret = 0;
					if (vec[k].f.s + 1 < vec[k].f.f)
						ret = get(vec[k].f.s + 1, vec[k].f.f - 1, sz(nodes));
					if (vec[k].f.s > 0)
						ret = max(ret, get(0, vec[k].f.s - 1, sz(nodes)));
					if (vec[k].f.f + 1 < sz(nodes))
						ret = max(ret, get(vec[k].f.f + 1, sz(nodes) - 1, sz(nodes)));
					if (ret > 0)
						ans = max(ans, ret + vec[k].s);
				}
				for (int k = i; k <= j; ++k) {
					auto [y, x] = vec[k].f;
					upd(x, vec[k].s, sz(nodes));
				}
				i = j;
			}
			
		}
		else {
			vector <pair <pii, int> > vec;
			for (auto [x, y] : edges) {
				if (!g[v].count(x) || !g[v].count(y))
					continue;
				if (x < y)
					swap(x, y);
				int tot = g[v][x] + g[v][y] + g[x][y];
				vec.pb({{x - 1, y - 1}, tot});
			}
			sort(all(vec));
			reverse(all(vec));
			for (int i = 0; i <= n * 2; ++i)
				s[i] = 0;
			for (int i = 0; i < sz(vec); ++i) {
				int j = i;
				while (j + 1 < sz(vec) && vec[j + 1].f.f == vec[j].f.f)
					++j;
				for (int k = i; k <= j; ++k) {
					int ret = 0;
					if (vec[k].f.s + 1 < vec[k].f.f)
						ret = get(vec[k].f.s + 1, vec[k].f.f - 1, n);
					if (vec[k].f.s > 0)
						ret = max(ret, get(0, vec[k].f.s - 1, n));
					if (vec[k].f.f + 1 < n)
						ret = max(ret, get(vec[k].f.f + 1, n - 1, n));
					if (ret > 0)
						ans = max(ans, ret + vec[k].s);
				}
				for (int k = i; k <= j; ++k) {
					auto [y, x] = vec[k].f;
					upd(x, vec[k].s, n);
				}
				i = j;
			}	
		}
	}
	if (!ans) ans = -1;
	cout << ans;
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 3ms
memory: 9064kb

input:

6 9
1 2 3
2 3 1
3 4 2
4 5 1
3 5 7
2 5 2
1 5 3
4 6 2
5 6 1

output:

18

result:

ok 1 number(s): "18"

Test #2:

score: 0
Accepted
time: 3ms
memory: 9088kb

input:

6 6
1 3 2
1 2 2
2 3 4
3 4 1
3 6 6
1 4 8

output:

-1

result:

ok 1 number(s): "-1"

Test #3:

score: 0
Accepted
time: 0ms
memory: 9444kb

input:

5 6
1 4 2
1 3 6
5 2 10
3 2 4
4 2 1
5 4 7

output:

-1

result:

ok 1 number(s): "-1"

Test #4:

score: 0
Accepted
time: 0ms
memory: 9352kb

input:

5 10
2 1 9
3 1 4
3 2 3
4 1 5
4 2 9
4 3 9
5 1 5
5 2 6
5 3 10
5 4 1

output:

43

result:

ok 1 number(s): "43"

Test #5:

score: 0
Accepted
time: 3ms
memory: 9004kb

input:

5 10
2 1 9
3 1 8
3 2 8
4 1 1
4 2 2
4 3 8
5 1 10
5 2 1
5 3 10
5 4 3

output:

46

result:

ok 1 number(s): "46"

Test #6:

score: 0
Accepted
time: 0ms
memory: 9116kb

input:

5 9
1 3 4
4 1 10
1 5 9
5 2 9
3 5 9
2 3 7
5 4 1
2 1 7
2 4 1

output:

45

result:

ok 1 number(s): "45"

Test #7:

score: 0
Accepted
time: 3ms
memory: 9060kb

input:

5 8
2 1 10
5 2 5
1 3 7
3 5 8
3 2 5
2 4 6
4 3 5
4 5 6

output:

41

result:

ok 1 number(s): "41"

Test #8:

score: 0
Accepted
time: 5ms
memory: 9336kb

input:

200 2000
182 97 91166
25 11 25393
179 58 43378
77 41 75588
139 96 94145
135 56 4609
190 159 47293
100 30 33854
21 132 93072
174 135 93547
144 137 81216
199 102 68247
89 155 53788
83 25 64607
166 179 44534
101 3 1474
37 106 57970
187 41 19892
16 76 32024
182 13 32061
72 69 5823
187 185 13918
151 86 3...

output:

552426

result:

ok 1 number(s): "552426"

Test #9:

score: 0
Accepted
time: 6ms
memory: 9480kb

input:

400 4000
102 372 24346
360 153 94255
272 316 33427
215 71 52304
368 202 60854
350 206 16796
32 372 31489
109 14 95840
163 71 79896
330 393 95303
324 110 13216
197 341 69668
54 241 46100
222 246 67388
140 13 539
272 79 22065
389 221 81398
187 122 60482
198 352 4291
196 14 18220
215 93 64141
336 54 54...

output:

545402

result:

ok 1 number(s): "545402"

Test #10:

score: -100
Wrong Answer
time: 4ms
memory: 9648kb

input:

600 6000
270 248 73879
94 543 63116
118 174 23476
152 301 12668
597 557 27564
566 156 28983
322 585 15685
319 598 41474
506 411 50369
334 450 80707
103 83 61569
195 333 71089
219 576 54764
409 18 70169
115 296 72896
92 155 42655
542 537 4827
387 202 1071
209 15 4380
511 165 22459
485 571 94537
570 2...

output:

538784

result:

wrong answer 1st numbers differ - expected: '545966', found: '538784'