QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#644585#5145. Shortest PathMonkey_LeeWA 403ms84944kbC++208.2kb2024-10-16 14:41:082024-10-16 14:41:09

Judging History

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

  • [2024-10-16 14:41:09]
  • 评测
  • 测评结果:WA
  • 用时:403ms
  • 内存:84944kb
  • [2024-10-16 14:41:08]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
using namespace std;
const long double eps=1e-12l;
const long double inf=1e14l;
const long double pi=acosl(-1.0l);
const long double s2=sqrtl(2);
struct vec//点或者向量
{
	long double x,y;
	vec operator +(const vec &a)const{return (vec){x+a.x,y+a.y};}
	vec operator -(const vec &a)const{return (vec){x-a.x,y-a.y};}
	long double operator *(const vec &a)const{return x*a.x+y*a.y;}//向量点乘
	vec operator *(const long double &a)const{return (vec){x*a,y*a};}//向量数乘(向量在左)
	vec operator /(const long double &a)const{return (vec){x/a,y/a};}//向量数除(向量在左)
	bool operator !=(const vec &a)const{return fabsl(a.x-x)>eps||fabsl(a.y-y)>eps;}
	bool operator ==(const vec &a)const{return fabsl(a.x-x)<=eps&&fabsl(a.y-y)<=eps;}
	bool operator <(const vec &a)const{return fabsl(x-a.x)>eps?(x<a.x):(y<a.y);}
	bool operator >(const vec &a)const{return fabsl(x-a.x)>eps?(x>a.x):(y>a.y);}
	bool operator <=(const vec &a)const{return fabsl(x-a.x)>eps?(x<a.x+eps):(y<a.y+eps);}
	bool operator >=(const vec &a)const{return fabsl(x-a.x)>eps?(x>a.x-eps):(y>a.y-eps);}
	long double operator ^(const vec &a)const{return x*a.y-y*a.x;}//向量叉乘
	friend ostream &operator <<(ostream &out,vec &a){return out<<a.x<<" "<<a.y;}
	friend istream &operator >>(istream &in,vec &a){return in>>a.x>>a.y;}
	vec rev(long double r){long double now=r+arg(),d=hypotl(x,y);return (vec){d*cos(now),d*sin(now)};}//向量逆时针旋转
	long double arg(){return atan2l(y,x);}//向量辐角
};
struct line//直线,存储直线上一点 a 和方向向量 d;或者线段,两端点分别为 a 和 a+d
{
	vec a,d;
	long double arg(){return d.arg();}
	long double slop(){if(fabsl(d.x)<eps)return d.y/fabsl(d.y)*inf;return d.y/d.x;}//求斜率
	long double gety(long double x){if(fabsl(d.x)<eps)return inf;return a.y+(x-a.x)/d.x*d.y;}//由x求y
	long double getx(long double y){if(fabsl(d.y)<eps)return inf;return a.x+(y-a.y)/d.y*d.x;}//由x求y
};
long double dis(vec a,vec b){return hypotl(a.x-b.x,a.y-b.y);}//两点间距
long double dis(vec a){return hypotl(a.x,a.y);}//向量模长
long double dis(vec a,line b){return fabsl((a-b.a)^b.d)/dis(b.d);}//点到直线之间的距离
bool check_left(vec a,vec b){return (a^b)>eps;}//检查 b 向量是否在 a 向量的左侧
bool check_right(vec a,vec b){return (a^b)<-eps;}//检查 b 向量是否在 a 向量的左侧
vec sec(line a,line b)//两直线交点,平行或重合返回(inf,inf)
{
	if(fabsl(a.d^b.d)<=eps)
		return {inf,inf};
	vec u=a.a-b.a;
	long double t=(b.d^u)/(a.d^b.d);
	return a.a+a.d*t;
}
vec pro(vec a,line b){return sec(b,(line){a,b.d.rev(pi/2)});}//求点在直线上的投影
bool check_in(line a,vec b){vec t1=a.a,t2=a.a+a.d;if(fabs((t1-b)^(t2-b))>eps)return 0;if(t1>t2)swap(t1,t2);return b>=t1&&b<=t2;}//判断点是否在线段内(含端点)
bool check(line t1,line t2){if(fabs(t1.d^t2.d)<=eps)return 0;return check_in(t1,sec(t1,t2));}//判断线段是否相交(重合视为不相交)
struct polygon//多边形,逆时针存点,请在末尾添加第一个点!
{
	vector<vec> nd;
	void init(){nd.push_back(nd[0]);}
	void push_back(vec a){nd.push_back(a);}
	long double C(){long double sum=0;for(int i=0;i<=(int)nd.size()-2;i++)sum+=dis(nd[i],nd[i+1]);return sum;}//求多边形的周长
	long double S(){long double sum=0;for(int i=1;i<=(int)nd.size()-3;i++)sum+=((nd[i]-nd[0])^(nd[i+1]-nd[0]));return fabsl(sum)/2;}//求多边形的面积
	int chk(vec b)//判断点和多边形的位置关系,多边形内返回-1,多边形上返回0,多边形外返回1
	{
		for(int i=0;i<(int)nd.size()-1;i++)
			if(check_in({nd[i],nd[i+1]-nd[i]},b))
				return 0;
		line a={b,{1,s2}};
		int cnt=0;
		for(int i=0;i<(int)nd.size()-1;i++)
		{
			line p={nd[i],nd[i+1]-nd[i]};
			vec now=sec(p,a);
			if(now>b&&check_in(p,now))
				cnt++;
		}
		if(cnt&1)
			return -1;
		return 1;
	}
};
struct cir//圆
{
	vec a;
	long double r;
	long double C(){return 2*pi*r;}//求圆的周长
	long double S(){return pi*r*r;}//求圆的面积
	int chk(vec b){long double d=dis(a,b);if(d<r-eps)return -1;else if(d<r+eps)return 0;return 1;}//判断点和圆的位置关系,圆内返回-1,圆上返回0,圆外返回1
};
bool in(cir a,vec b){return dis(a.a,b)<=a.r+eps;}//判断点是否在圆内部
pair<vec,vec> sec(cir a,cir b)//求两圆的交点,相切算作两个交点,无交点返回(inf,inf)
{
	long double d=dis(a.a,b.a);
	if(d>a.r+b.r+eps||d<fabs(a.r-b.r)-eps)
		return make_pair((vec){inf,inf},(vec){inf,inf});
	long double p=acos((a.r*a.r+d*d-b.r*b.r)/2.0/d/a.r);
	vec ri=b.a-a.a;ri=ri*(a.r/d);
	return make_pair(a.a+ri.rev(p),a.a+ri.rev(-p));
}
pair<vec,vec> sec(cir a,line b)//求圆与直线的交点,相切算作两个交点,无交点返回(inf,inf)
{
	long double d=dis(a.a,b);
	if(d>a.r+eps)
		return make_pair((vec){inf,inf},(vec){inf,inf});
	long double q=sqrtl(a.r*a.r-d*d);
	line c=(line){a.a,b.d.rev(pi/2)};
	vec t=sec(b,c);
	b.d=b.d/dis(b.d)*q;
	return make_pair(t-b.d,t+b.d);
}

const int maxn=2200;
const int maxm=5100;
const int lim=10000;
const int mod=998244353;
int T,n,m,x;
int u[maxm],v[maxm],w[maxm];
long long f[maxn][lim+5],g[maxn][lim+5];
vector<pair<int,int> > G[maxn];

line e[maxm],L[maxm];
vec N[maxm];
int top=0,id[maxm],hd=1,tl=0;
long double ag[maxm];
bool cmp1(int a,int b)
{
	if(fabsl(ag[a]-ag[b])>=eps)
		return ag[a]<ag[b];
	if((e[b].d^(e[a].a-e[b].a))>eps)
		return 1;
	return 0;
}
bool cmp2(int a,int b){return fabsl(ag[a]-ag[b])<eps;}
void solve()
{
	hd=1,tl=0;
	for(int i=1;i<=top;i++)
		id[i]=i,ag[i]=e[i].arg();
	sort(id+1,id+top+1,cmp1);
	top=unique(id+1,id+top+1,cmp2)-id-1;
	for(int i=1;i<=top;i++)
	{
		line now=e[id[i]];
		while(hd<=tl&&(now.d^(N[tl]-now.a))<-eps)
			tl--;
		while(hd<=tl&&(now.d^(N[hd]-now.a))<-eps)
			hd++;
		if(i!=1)
			tl++,N[tl]=sec(L[tl],now);
		L[tl+1]=now;
	}
	while(hd<=tl&&(L[hd].d^(N[tl]-L[hd].a))<-eps)
		tl--;
	if(tl-hd>=1)
		tl++,N[tl]=sec(L[tl],L[hd]),N[hd-1]=N[tl];
}

int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&n,&m,&x);
		for(int i=1;i<=n;i++)
		{
			G[i].clear();
			for(int j=0;j<=lim;j++)
				f[i][j]=g[i][j]=1e18;
		}
		for(int i=1;i<=m;i++)
			scanf("%d%d%d",&u[i],&v[i],&w[i]),G[u[i]].emplace_back(v[i],w[i]),G[v[i]].emplace_back(u[i],w[i]);
		if(n==1)
		{
			puts("0");
			continue;
		}
		f[1][0]=0,g[n][0]=0;
		for(int i=0;i<lim;i++)
			for(int x=1;x<=n;x++)
				for(auto [t,val]:G[x])
					f[t][i+1]=min(f[t][i+1],f[x][i]+val),g[t][i+1]=min(g[t][i+1],g[x][i]+val);
		int cnt=0;
		for(int i=1;i<=lim&&i<=x;i++)
			cnt=(cnt+(f[n][i]==1e18?0:f[n][i]))%mod;
		if(x>lim)
		{
			if(f[n][lim]!=1e18)
			{
				top=0;
				for(int i=1;i<=m;i++)
				{
					long long mn0=1e18;
					for(int j=0;j<lim;j++)
						mn0=min({mn0,w[i]+f[u[i]][j]+g[v[i]][lim-1-j],w[i]+f[v[i]][j]+g[u[i]][lim-1-j]});
					if(mn0<1e18)
						e[++top]={{lim,(long double)mn0},{-1,-(long double)w[i]}};
				}
				e[++top]={{(long double)x,0},{0,1}};
				e[++top]={{(long double)(lim+1),0},{0,-1}};
				e[++top]={{0,0},{1,0}};
				solve();
				for(int i=hd;i<=tl-2;i++)
				{
					int l=int(N[i].x+eps)+1,r=int(N[i-1].x+eps);
					if(l&1)
						l++;
					if(r&1)
						r--;
					long long fi=(long long)(L[i].gety((long double)l)+eps),la=(long long)(L[i].gety((long double)r)+eps);
					cnt=(cnt+1ll*(la+fi)%mod*((r-l)/2+1)%mod*(mod+1)/2)%mod;
				}
			}
			if(f[n][lim-1]!=1e18)
			{
				top=0;
				for(int i=1;i<=m;i++)
				{
					long long mn1=1e18;
					for(int j=0;j<lim-1;j++)
						mn1=min({mn1,w[i]+f[u[i]][j]+g[v[i]][lim-2-j],w[i]+f[v[i]][j]+g[u[i]][lim-2-j]});
					if(mn1<1e18)
						e[++top]={{lim-1,(long double)mn1},{-1,-(long double)w[i]}};
				}
				e[++top]={{(long double)x,0},{0,1}};
				e[++top]={{(long double)(lim),0},{0,-1}};
				e[++top]={{0,0},{1,0}};
				solve();
				for(int i=hd;i<=tl-2;i++)
				{
					int l=int(N[i].x+eps)+1,r=int(N[i-1].x+eps);
					if(!(l&1))
						l++;
					if(!(r&1))
						r--;
					long long fi=(long long)(L[i].gety((long double)l)+eps),la=(long long)(L[i].gety((long double)r)+eps);
					cnt=(cnt+1ll*(la+fi)%mod*((r-l)/2+1)%mod*(mod+1)/2)%mod;
				}
			}
		}
		printf("%d\n",cnt);
	}
	
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 2ms
memory: 8364kb

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: 218ms
memory: 6328kb

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: 221ms
memory: 6328kb

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: 223ms
memory: 7908kb

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: 221ms
memory: 6376kb

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: 279ms
memory: 15184kb

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: 280ms
memory: 14356kb

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: 276ms
memory: 15048kb

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: 278ms
memory: 15152kb

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: 403ms
memory: 81040kb

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: 0
Accepted
time: 399ms
memory: 81216kb

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:

603678306
943491463
173268290
201396620

result:

ok 4 number(s): "603678306 943491463 173268290 201396620"

Test #12:

score: 0
Accepted
time: 379ms
memory: 81368kb

input:

4
475 925 862065786
223 259 326692
311 176 146944
236 82 519523
454 402 81050
314 40 916288
147 431 876771
457 438 621257
400 157 931920
22 170 696985
236 219 335364
229 83 709348
238 112 98295
284 436 112450
38 119 757155
256 275 92474
194 116 661424
306 15 548944
308 426 87714
9 203 246801
288 448...

output:

0
700852946
806811784
955695134

result:

ok 4 number(s): "0 700852946 806811784 955695134"

Test #13:

score: -100
Wrong Answer
time: 402ms
memory: 84944kb

input:

4
468 943 401471037
16 76 84807660
391 15 339856779
217 269 160461855
105 400 445538323
90 401 136863755
23 152 971192392
51 339 208461283
467 55 188586800
61 65 493966321
140 229 716542747
182 270 337275222
154 76 601108616
377 254 684327428
103 375 734134843
327 225 26827769
26 248 368659099
457 5...

output:

697249979
949982920
704282666
807538763

result:

wrong answer 1st numbers differ - expected: '158572391', found: '697249979'