QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#401078#5145. Shortest PathzhouhuanyiWA 1ms10052kbC++143.5kb2024-04-27 21:33:252024-04-27 21:33:26

Judging History

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

  • [2024-04-27 21:33:26]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:10052kb
  • [2024-04-27 21:33:25]
  • 提交

answer

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#define N 4000
#define mod 998244353
using namespace std;
const long long inf=(long long)(1e18);
const int INF=(int)(1e9)+1;
int read()
{
	char c=0;
	int sum=0;
	while (c<'0'||c>'9') c=getchar();
	while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
	return sum;
}
void Adder(int &x,int d)
{
	x+=d;
	if (x>=mod) x-=mod;
	return;
}
struct reads
{
	int num,data;
};
struct points
{
	int x;
	long long y;
	bool operator < (const points &t)const
	{
		return x!=t.x?x<t.x:y<t.y;	
	}
};
points tong[N+1],dque[N+1];
int T,n,m,t,top,ans,length,minn[N+1];
long long dp[N+1][N+1],dp2[N+1][N+1],sminn[2],sminn2[2];
vector<reads>E[N+1];
void add(int x,int y,int z)
{
	minn[x]=min(minn[x],z),minn[y]=min(minn[y],z),E[x].push_back((reads){y,z}),E[y].push_back((reads){x,z});
	return;
}
bool check(points a,points b,points c)
{
	return 1ll*(b.y-a.y)*(c.x-a.x)>=1ll*(c.y-a.y)*(b.x-a.x);
}
long long get(long long a,int b)
{
	if (!b) return a>=0?INF:-INF;
	else if (a>=0) return a/b+1;
	else return -(-a-1)/b;
}
long long get2(long long a,int b)
{
	if (!b) return a>=0?INF:-INF;
	else if (a>=0) return a/b;
	else return -(-a+b-1)/b;
}
void calc(int x)
{
	long long l,r;
	sort(tong+1,tong+length+1),top=0;
	for (int i=1;i<=length;++i)
	{
		while (top>=2&&check(dque[top-1],dque[top],tong[i])) top--;
		dque[++top]=tong[i];
	}
	for (int i=1;i<=top;++i)
	{
		l=0,r=x;
		if (i+1<=top) l=max(l,get(dque[i].y-dque[i+1].y,dque[i+1].x-dque[i].x));
		if (i-1>=1) r=min(r,get2(dque[i-1].y-dque[i].y,dque[i].x-dque[i-1].x));
		if (l<=r)
		{
			Adder(ans,(r-l+1)*(dque[i].y%mod)%mod);
			Adder(ans,(((r*(r+1)>>1)-((l*(l-1))>>1))%mod)*dque[i].x%mod);
		}
	}
	return;
}
int main()
{
	int x,y,z,d;
	T=read();
	while (T--)
	{
		n=read(),m=read(),t=read(),ans=0;
		for (int i=1;i<=n;++i) E[i].clear(),minn[i]=INF;
		for (int i=1;i<=m;++i) x=read(),y=read(),z=read(),add(x,y,z);
		for (int i=0;i<=(n<<1);++i)
			for (int j=1;j<=n;++j)
				dp[i][j]=dp2[i][j]=inf;
		dp[0][1]=dp2[0][n]=0;
		for (int i=1;i<=(n<<1);++i)
			for (int j=1;j<=n;++j)
				for (int k=0;k<E[j].size();++k)
					dp[i][j]=min(dp[i][j],dp[i-1][E[j][k].num]+E[j][k].data),dp2[i][j]=min(dp2[i][j],dp2[i-1][E[j][k].num]+E[j][k].data);
		for (int i=0;i<=min(t,n<<1);++i)
			if (dp[i][n]!=inf)
				Adder(ans,dp[i][n]%mod);
		if (t>=(n<<1)+1&&dp[(n<<1)-1][n]!=inf)
		{
			d=(t-(n<<1)-1)>>1,length=0;
			for (int i=1;i<=n;++i)
				if (minn[i]!=INF)
				{
					for (int op=0;op<=1;++op) sminn[op]=sminn2[op]=inf;
					for (int j=0;j<=n;++j) sminn[j&1]=min(sminn[j&1],dp[j][i]-1ll*minn[i]*j),sminn2[j&1]=min(sminn2[j&1],dp2[j][i]-1ll*minn[i]*j);
					if (min(sminn[0]+sminn2[1],sminn[1]+sminn2[0])+1ll*minn[i]*((n<<1)+1)<inf) tong[++length]=(points){minn[i]<<1,min(sminn[0]+sminn2[1],sminn[1]+sminn2[0])+1ll*minn[i]*((n<<1)+1)};
				}
			calc(d);
		}
		if (t>=(n<<1)+2&&dp[n<<1][n]!=inf)
		{
			d=(t-(n<<1)-2)>>1,length=0;
			for (int i=1;i<=n;++i)
				if (minn[i]!=INF)
				{
					for (int op=0;op<=1;++op) sminn[op]=sminn2[op]=inf;
					for (int j=0;j<=n;++j) sminn[j&1]=min(sminn[j&1],dp[j][i]-1ll*minn[i]*j),sminn2[j&1]=min(sminn2[j&1],dp2[j][i]-1ll*minn[i]*j);
					if (min(sminn[0]+sminn2[0],sminn[1]+sminn2[1])+1ll*minn[i]*((n<<1)+2)<inf) tong[++length]=(points){minn[i]<<1,min(sminn[0]+sminn2[0],sminn[1]+sminn2[1])+1ll*minn[i]*((n<<1)+2)};
				}
			calc(d);
		}
		printf("%d\n",ans);
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 5952kb

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: 0ms
memory: 10052kb

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: -100
Wrong Answer
time: 1ms
memory: 6024kb

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:

wrong answer 286th numbers differ - expected: '248769754', found: '878182835'