QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#567838#5145. Shortest PathfryanTL 2644ms40924kbC++205.2kb2024-09-16 14:11:032024-09-16 14:11:03

Judging History

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

  • [2024-09-16 14:11:03]
  • 评测
  • 测评结果:TL
  • 用时:2644ms
  • 内存:40924kb
  • [2024-09-16 14:11:03]
  • 提交

answer

#pragma GCC optimize("O3,unroll-loops")
#include "bits/stdc++.h"
using namespace std;
#define int int64_t
#define i128 int128_t
#define all(x) begin(x), end(x)
#define sz(x) (int) (x).size()

const int BUF_SZ = 1 << 15;
inline namespace Input {
	char buf[BUF_SZ];int pos;int len;
	char next_char() {
	if (pos == len) {pos = 0;
	len = (int)fread(buf, 1, BUF_SZ, stdin);
	if (!len) { return EOF; }}
	return buf[pos++];}
	int read_int() {
	int x;char ch;int sgn = 1;
	while (!isdigit(ch = next_char())) {
	if (ch == '-') { sgn *= -1; }}
	x = ch - '0';
	while (isdigit(ch = next_char())) { x = x * 10 + (ch - '0'); }
	return x * sgn;}
}
inline namespace Output {
	char buf[BUF_SZ];int pos;
	void flush_out() {fwrite(buf, 1, pos, stdout);pos = 0;}
	void write_char(char c) {
	if (pos == BUF_SZ) { flush_out(); }
	buf[pos++] = c;}
	void write_int(int x) {
	static char num_buf[100];
	if (x < 0) {write_char('-');x *= -1;}
	int len = 0;
	for (; x >= 10; x /= 10) { num_buf[len++] = (char)('0' + (x % 10)); }
	write_char((char)('0' + x));
	while (len) { write_char(num_buf[--len]); }
	write_char('\n');}
	void init_output() { assert(atexit(flush_out) == 0); }
}

const int inf = 1e18;

const int mxn = 2e3+50;
const int F = 2;
const int LO = 0, HI = 2e9;
const int mod = 998244353;

int n,m,x;
vector<array<int,2>> adj[mxn];
int dist1[mxn][F*mxn], distn[mxn][F*mxn];
priority_queue<array<int,3>,vector<array<int,3>>,greater<array<int,3>>> dij;
vector<array<int,2>> line; // first relevant, m, b

inline int ev(array<int,2> l, int x) {
	return l[0]*x+l[1];
}
inline int first_lower(array<int,2> l1, array<int,2> l2) {
	auto [m1,b1] = l1;
	auto [m2,b2] = l2;
	int x = (b1-b2)/(m2-m1);
	while (ev(l1,x) > ev(l2,x)) {x++;}
	return x;
}

void solve() {
	n=read_int(),m=read_int(),x=read_int();
	
	for (int i=0; i<n; i++) {adj[i].clear();}
	for (int i=0; i<n; i++) {for (int j=0; j<F*n+20; j++) {dist1[i][j] = distn[i][j] = inf;}}
	
	for (int i=0; i<m; i++) {
		int u=read_int(),v=read_int(),w=read_int(); u--; v--;
		adj[u].push_back({v,w}); adj[v].push_back({u,w});
	}
	dij.push({0,0,0});
	while (sz(dij)) {
		auto [d,v,l] = dij.top(); dij.pop();
		if (dist1[v][l] <= d) {
			continue;
		}
		dist1[v][l] = d;
		if (l==F*n+10) continue;
		for (auto [u,dt] : adj[v]) {
			dij.push({dt+d,u,l+1});
		}
	}
	dij.push({0,n-1,0});
	while (sz(dij)) {
		auto [d,v,l] = dij.top(); dij.pop();
		if (distn[v][l] <= d) {continue;}
		distn[v][l] = d;
		if (l==F*n+10) continue;
		for (auto [u,dt] : adj[v]) {
			dij.push({dt+d,u,l+1});
		}
	}
	line.clear();
	for (int i=0; i<n; i++) {
		for (auto [j,d] : adj[i]) {
			int md0 = inf;
			for (int li=0; li<=F*n; li++) {
				md0 = min(md0, dist1[j][li]+distn[j][F*n-li]);
			}
			if (md0==inf) continue;
			line.push_back({d,md0-F*n*d});
		}
	}
	sort(all(line)); reverse(all(line));
	vector<array<int,4>> revl;
	for (auto [m,b] : line) {
		while (sz(revl)) {
			auto [m1,b1,fp,lp] = revl.back();
			if (ev({m1,b1},fp) >= ev({m,b},fp) && ev({m1,b1},lp) >= ev({m,b},lp)) {
				revl.pop_back();
				if (sz(revl)) {revl.back()[3] = lp;}
			} else {break;}
		}
		if (!sz(revl)) {revl.push_back({m,b,LO,HI}); continue;
		} else {
			auto [m1,b1,fp,lp] = revl.back();
			if (ev({m1,b1},fp)<=ev({m,b},fp) && ev({m1,b1},lp)<=ev({m,b},lp)) {continue;}
			int ff = first_lower({m,b},{m1,b1}); assert(ff>fp);
			revl[sz(revl)-1][3] = ff-1; revl.push_back({m,b,ff,HI});
		}
	}
	
	int tsu=0;
	
	for (auto [m,b,s,f] : revl) {
		if (f < F*n) continue;
		if (s > x) continue;
		int lo = max(F*n,s), hi = min(x,f);
		if (lo%2) lo++;
		if (hi%2) hi--;
		if (lo>hi) continue;
		int num = (hi-lo)/2+1; int avg = (lo+hi)/2;
		int val = ((num*b)%mod+(num*avg)%mod*m)%mod;
		tsu += val; tsu %= mod;
	}
	
	line.clear(); revl.clear();	
	for (int i=0; i<n; i++) {
		for (auto [j,d] : adj[i]) {
			//dist of F*n+1
			int md1 = inf;
			for (int li=0; li<=F*n+1; li++) {
				md1 = min(md1, dist1[j][li]+distn[j][F*n+1-li]);
			}
			if (md1==inf) continue;
			line.push_back({d,md1-(F*n+1)*d});
		}
	}
	sort(all(line)); reverse(all(line));
	for (auto [m,b] : line) {
		while (sz(revl)) {
			auto [m1,b1,fp,lp] = revl.back();
			if (ev({m1,b1},fp) >= ev({m,b},fp) && ev({m1,b1},lp) >= ev({m,b},lp)) {
				revl.pop_back();
				if (sz(revl)) {revl.back()[3] = lp;}
			} else {break;}
		}
		if (!sz(revl)) {revl.push_back({m,b,LO,HI}); continue;
		} else {
			auto [m1,b1,fp,lp] = revl.back();
			if (ev({m1,b1},fp)<=ev({m,b},fp) && ev({m1,b1},lp)<=ev({m,b},lp)) {continue;}
			int ff = first_lower({m,b},{m1,b1}); assert(ff>fp);
			revl[sz(revl)-1][3] = ff-1; revl.push_back({m,b,ff,HI});
		}
	}
	for (auto [m,b,s,f] : revl) {
		if (f < F*n) continue;
		if (s > x) continue;
		int lo = max(F*n,s), hi = min(x,f);
		if (lo%2==0) lo++;
		if (hi%2==0) hi--;
		if (lo>hi) continue;
		int num = (hi-lo)/2+1; int avg = (lo+hi)/2;
		int val = ((num*b)%mod+(num*avg)%mod*m)%mod;
		tsu += val; tsu %= mod;
	}
	
	for (int d=0; d<F*n; d++) {
		tsu+=(dist1[n-1][d]==inf?0:dist1[n-1][d]); tsu %= mod;
	}
	
	write_int(tsu);
}

signed main() {
	ios::sync_with_stdio(false); cin.tie(nullptr);
	init_output();
	
	int t = read_int();
	while (t--) {
		solve();
	}
	
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 5960kb

input:

4
3 2 10
1 2 5
2 3 4
3 0 1000000000
3 3 100
1 2 3
1 3 4
2 3 5
4 6 1000000000
1 2 244
1 2 325
1 4 927
3 3 248
2 4 834
3 4 285

output:

125
0
15300
840659991

result:

ok 4 number(s): "125 0 15300 840659991"

Test #2:

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

input:

400
4 7 850187899
1 2 83
1 2 24
3 1 23
2 3 80
3 3 65
1 2 55
2 4 31
4 7 297586795
3 4 54
1 1 66
2 2 75
1 3 68
1 4 27
1 4 29
2 3 96
5 7 217277444
3 3 9
3 4 36
2 2 77
5 5 38
3 3 6
1 2 18
1 2 23
5 6 379032278
5 5 96
4 3 92
3 2 49
4 3 44
1 4 19
1 1 18
5 6 534284598
5 1 59
1 2 2
3 3 55
2 2 24
5 4 34
2 4 7...

output:

191476186
406722183
0
0
58483482
115858544
177378789
656019644
858116309
0
38761681
633010531
0
696693112
919354187
122684249
865793975
91541737
248634956
0
374201737
455984810
284991806
322357914
0
514668426
407812429
555256220
0
419773408
989291360
743372489
0
716008724
0
189418326
244106015
41273...

result:

ok 400 numbers

Test #3:

score: 0
Accepted
time: 7ms
memory: 5952kb

input:

400
4 6 415388949
4 2 6853
4 3 5541
1 2 6273
4 4 8561
4 1 9638
4 2 8341
4 6 195566032
2 3 6344
1 1 7616
3 1 4823
4 1 647
4 4 7091
4 2 6307
4 6 720662513
3 3 4435
2 1 4448
4 3 3142
4 1 6670
2 4 5545
2 3 2990
5 7 806244066
3 2 3989
4 3 8157
5 2 612
3 5 8294
1 1 2114
3 4 2311
5 2 8825
5 6 894954332
4 1...

output:

392283147
970308579
491899881
0
495762954
10156057
664457753
0
575852185
134843393
933754264
590740253
0
490859785
724017823
957609109
0
622353894
279038091
426991125
0
637389724
0
75171267
749597224
258493187
250907837
497917111
886569508
828505392
68793449
224109727
139499076
786372001
894480753
4...

result:

ok 400 numbers

Test #4:

score: 0
Accepted
time: 8ms
memory: 7968kb

input:

400
4 6 626798206
4 4 835705
3 2 236950
2 4 952235
1 2 581609
3 2 204788
2 1 947505
5 7 121450775
2 2 288007
3 2 130288
5 4 76431
4 5 23594
2 5 675316
4 1 192066
3 3 275296
5 7 867412084
1 4 473530
4 3 242225
2 3 459428
2 2 852747
4 1 242292
1 2 9788
3 2 175026
5 6 270426492
5 4 75346
4 2 880851
5 2...

output:

359593563
746525185
0
0
73714485
664197694
720306834
414192169
852090104
263236207
112963474
326265087
32838160
575302262
917139513
704934710
717038510
608349067
804139086
30761395
0
885174847
903442468
235788993
315187893
267383762
881704492
392427980
511540414
82510129
841018587
628947824
90374582...

result:

ok 400 numbers

Test #5:

score: 0
Accepted
time: 7ms
memory: 5716kb

input:

400
4 7 237940126
2 3 811465519
3 1 406242509
4 2 568535949
4 4 916500298
3 2 79853489
2 4 485382745
2 3 421622532
5 6 680552144
5 4 315694734
4 1 414031567
5 4 530765372
2 5 734798151
4 5 677388912
3 2 511925895
4 6 174169143
1 2 355579133
1 1 374390087
3 3 393590012
2 3 72192607
1 2 898660531
3 1 ...

output:

80828666
371586866
0
167800461
410107945
445437334
0
610069154
796266829
467729673
259462318
581867042
658714588
354982099
590749802
487914460
0
115063504
426498590
124790015
0
408391987
0
108209715
16338078
814297806
454529244
185281507
453042901
940987029
353015051
435087926
0
0
246967770
0
929531...

result:

ok 400 numbers

Test #6:

score: 0
Accepted
time: 138ms
memory: 6060kb

input:

40
46 100 796871833
14 45 5
34 15 75
18 35 36
18 24 62
7 36 17
17 9 45
31 33 11
33 15 34
23 5 72
23 27 44
16 15 3
10 28 18
1 36 89
4 40 32
46 43 55
14 22 61
30 15 36
8 2 82
21 12 15
42 45 78
26 40 11
46 32 42
26 46 10
39 40 83
37 39 95
45 27 45
32 37 91
2 19 34
9 7 74
28 5 99
3 44 34
33 38 6
18 13 7...

output:

486700134
857700687
608672173
864577567
889360467
813527860
503310571
949592684
427562681
54612131
295765111
981822742
297387832
510195726
183427910
339067217
163331381
781441071
387001805
800276039
215789954
315236685
325091800
561623521
0
564200504
58828620
705573545
860792488
149660643
968795549
...

result:

ok 40 numbers

Test #7:

score: 0
Accepted
time: 103ms
memory: 10048kb

input:

40
49 98 637035062
28 11 4294
36 2 7586
44 33 6870
19 3 4054
38 5 2009
2 26 6184
5 45 2951
33 23 7022
18 38 3008
46 19 8137
49 18 6080
18 37 8209
18 8 9077
31 43 6509
42 22 5743
2 18 9127
16 2 8584
38 11 7504
15 12 2867
1 19 8063
11 26 9017
17 3 6127
23 19 5473
13 38 4521
25 37 7360
31 34 6656
47 22...

output:

821693058
71016907
857321273
783587298
982610065
980278015
275485521
971090373
233315886
399922806
0
278608644
378866648
599249221
340396754
540768603
530594607
776205772
730857174
933810552
227365258
382149558
937071245
521975672
690097593
73883754
33862436
462058733
443441774
438932117
64257634
58...

result:

ok 40 numbers

Test #8:

score: 0
Accepted
time: 94ms
memory: 9988kb

input:

40
46 95 723931456
35 20 947776
31 38 238603
37 17 836768
12 40 35931
25 6 38152
17 27 195009
37 26 230999
2 12 963773
22 18 283748
9 34 499029
30 9 601767
38 4 966623
21 3 740901
32 31 66189
9 46 751585
38 27 412857
40 28 136769
2 17 118003
21 18 102142
45 31 319817
33 13 496656
16 5 168278
37 15 9...

output:

862261239
934208524
676535904
425060961
680809878
921710894
166137599
490099382
786664556
667359023
117551032
65363912
805410419
453568705
636903494
876708711
0
874460066
688545496
770335168
196141613
286072255
826782785
385627101
487670842
692193056
921891801
493485960
746027697
94281264
761466453
...

result:

ok 40 numbers

Test #9:

score: 0
Accepted
time: 101ms
memory: 8148kb

input:

40
50 90 857563025
2 11 393746492
45 46 345072720
13 18 637861512
47 3 571609922
50 35 402605542
23 36 161663167
27 20 267096312
50 47 967313350
6 23 797326121
12 47 19611590
32 22 693454539
6 40 749059549
14 47 655748726
9 32 774397775
49 22 471626653
18 23 775770441
8 47 263012466
17 27 714895319
...

output:

823474705
897491227
830605997
310507990
396608942
755858403
192083730
558837131
397169944
133851804
124398473
334337729
676169091
498313169
10613351
887468199
938570424
730866390
93748497
991959257
969327421
950615046
29589899
290773789
436801411
468797561
311350228
807413343
196500651
737421403
330...

result:

ok 40 numbers

Test #10:

score: 0
Accepted
time: 2644ms
memory: 40924kb

input:

4
452 997 787553451
224 333 31
99 434 28
63 105 64
15 304 41
43 356 18
359 280 70
446 415 69
256 296 47
276 108 23
138 249 8
152 281 31
284 122 45
1 10 39
348 216 4
260 386 51
442 340 3
305 316 81
103 267 18
444 14 16
418 221 20
366 343 72
448 265 44
419 417 60
433 251 19
138 373 42
221 251 52
219 2...

output:

920051934
337790394
379237832
857209587

result:

ok 4 number(s): "920051934 337790394 379237832 857209587"

Test #11:

score: -100
Time Limit Exceeded

input:

4
488 933 522189685
296 341 4432
469 325 7333
230 83 8870
61 45 9898
236 85 6295
90 304 7287
486 400 6268
115 485 7251
455 214 9376
74 402 2519
461 119 4761
379 238 966
235 139 5469
365 82 5901
143 101 4371
110 323 8173
126 186 9270
451 315 9574
340 282 2321
152 360 7030
112 317 3895
388 484 1202
21...

output:


result: