QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#454152#4363. Branch Assignmentmzmz001WA 1211ms5356kbC++141.9kb2024-06-24 16:55:022024-06-24 16:55:03

Judging History

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

  • [2024-06-24 16:55:03]
  • 评测
  • 测评结果:WA
  • 用时:1211ms
  • 内存:5356kb
  • [2024-06-24 16:55:02]
  • 提交

answer

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,b,k,m,idx,h[5005],vis[5005],in[5005],out[5005],sb[5005],qzh[5005];
ll dp[5005],num[5005];
struct node{
	ll from,v,w;
}G[50005];
struct node2{
	ll u,w;
	bool operator < (const node2 &x)const{
		return w>x.w;
	}
};
struct node3{
	ll l,r,p;
}tp[5005];
priority_queue<node2> q;
void make(ll u,ll v,ll w){
	G[++idx].v=v;
	G[idx].from=h[u];
	G[idx].w=w;
	h[u]=idx;
}
void djstl(ll x,ll dis[],ll op){
	for(ll i=1;i<=n;i++)vis[i]=0,dis[i]=1e14;
	q.push({x,0});
	dis[x]=0;
	while(!q.empty()){
		ll u=q.top().u;
		q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(ll i=h[u];i;i=G[i].from){
			if((i&1ll)^op)continue;
			ll v=G[i].v,w=G[i].w;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				q.push({v,dis[v]});
			}
		}
	}
}
ll culcu(ll x,ll y){
	return dp[x]+(y-x-1)*(qzh[y]-qzh[x]);
}
ll erfen2(ll x,ll y){
	ll l=tp[x].l,r=tp[x].r,z=tp[x].p,mid;
	if(!(culcu(y,r)<culcu(z,r)||(culcu(y,r)==culcu(z,r)&&num[y]>num[z])))return r+1;
	while(l<r){
		mid=(l+r)/2;
		if(culcu(y,mid)<culcu(z,mid)||(culcu(y,mid)==culcu(z,mid)&&num[y]>num[z]))r=mid;
		else l=mid+1;
	}
	return l;
}
ll check(ll val){
	dp[0]=num[0]=0;
	for(ll i=1;i<=b;i++){
		dp[i]=1e18;
		for(ll j=0;j<i;j++){
			if((culcu(j,i)+val<dp[i])||(culcu(j,i)==dp[i]&&num[j]+1>num[i])){
				dp[i]=culcu(j,i)+val;
				num[i]=num[j]+1;
			}
		}
	}
	return num[b];
}
ll erfen(ll k){
	ll l=-1e15,r=1e15,mid;
	while(l<r){
		mid=(l+r+1)>>1;
		if(check(mid)>=k)l=mid;
		else r=mid-1;
	}
	ll sum=check(l);
	return dp[b]-l*sum;
}
int main(){
	scanf("%lld%lld%lld%lld",&n,&b,&k,&m);
	for(ll i=1;i<=m;i++){
		ll u,v,w;
		scanf("%lld%lld%lld",&u,&v,&w);
		make(u,v,w),make(v,u,w);
	}
	djstl(b+1,in,1);
	djstl(b+1,out,0);
	for(ll i=1;i<=b;i++)in[i]+=out[i];
	sort(in+1,in+b+1);
	for(ll i=1;i<=b;i++)qzh[i]=qzh[i-1]+in[i];
	printf("%lld",erfen(k));
}

详细

Test #1:

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

input:

5 4 2 10
5 2 1
2 5 1
3 5 5
4 5 0
1 5 1
2 3 1
3 2 5
2 4 5
2 1 1
3 4 2

output:

13

result:

ok single line: '13'

Test #2:

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

input:

5 4 2 10
5 2 1
2 5 1
3 5 5
4 5 10
1 5 1
2 3 1
3 2 5
2 4 5
2 1 1
3 4 2

output:

24

result:

ok single line: '24'

Test #3:

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

input:

5 4 3 8
1 5 15
5 1 15
2 5 2
5 2 3
3 5 1
5 3 1
4 5 2
5 4 0

output:

4

result:

ok single line: '4'

Test #4:

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

input:

2 1 1 2
1 2 5
2 1 3

output:

0

result:

ok single line: '0'

Test #5:

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

input:

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

output:

304

result:

ok single line: '304'

Test #6:

score: 0
Accepted
time: 660ms
memory: 4564kb

input:

5000 4999 2 9998
1 2 10000
2 1 10000
2 3 10000
3 2 10000
3 4 10000
4 3 10000
4 5 10000
5 4 10000
5 6 10000
6 5 10000
6 7 10000
7 6 10000
7 8 10000
8 7 10000
8 9 10000
9 8 10000
9 10 10000
10 9 10000
10 11 10000
11 10 10000
11 12 10000
12 11 10000
12 13 10000
13 12 10000
13 14 10000
14 13 10000
14 15...

output:

589335814500000

result:

ok single line: '589335814500000'

Test #7:

score: 0
Accepted
time: 671ms
memory: 4664kb

input:

5000 4999 100 9998
1 2 1
2 3 1
3 4 1
4 5 1
5 6 1
6 7 1
7 8 1
8 9 1
9 10 1
10 11 1
11 12 1
12 13 1
13 14 1
14 15 1
15 16 1
16 17 1
17 18 1
18 19 1
19 20 1
20 21 1
21 22 1
22 23 1
23 24 1
24 25 1
25 26 1
26 27 1
27 28 1
28 29 1
29 30 1
30 31 1
31 32 1
32 33 1
33 34 1
34 35 1
35 36 1
36 37 1
37 38 1
38...

output:

1224510000

result:

ok single line: '1224510000'

Test #8:

score: -100
Wrong Answer
time: 1211ms
memory: 5356kb

input:

5000 4900 2000 50000
3116 1995 5417
1801 380 719
4749 13 4103
1175 493 659
596 3035 2098
628 2199 2816
711 3295 5220
4888 4316 153
1007 2136 1990
1365 1579 8062
4076 1263 7023
3114 3756 2785
3695 3175 3364
2302 3474 5739
3062 3705 9620
3815 1026 7712
3991 3582 3049
3245 2397 5834
18 1456 1619
2186 4...

output:

-9188051185500179716

result:

wrong answer 1st lines differ - expected: '166040058', found: '-9188051185500179716'