QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#644585 | #5145. Shortest Path | Monkey_Lee | WA | 403ms | 84944kb | C++20 | 8.2kb | 2024-10-16 14:41:08 | 2024-10-16 14:41:09 |
Judging History
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'