QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#733859#9569. SubwayyhdddTL 4ms34164kbC++142.9kb2024-11-10 21:38:442024-11-10 21:38:44

Judging History

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

  • [2024-11-10 21:38:44]
  • 评测
  • 测评结果:TL
  • 用时:4ms
  • 内存:34164kb
  • [2024-11-10 21:38:44]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
#define mod 998244353ll
#define pii pair<int,int>
#define fi first
#define se second
#define mems(x,y) memset(x,y,sizeof(x))
#define pb push_back
#define db double
using namespace std;
const int maxn=200010;
const int inf=1e18;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
	return x*f;
}
bool Mbe;

int n,k;
int a[maxn],b[maxn];
vector<pii> e[maxn];
vector<int> dis[maxn];
vector<bool> vis[maxn];
vector<pii> pos[maxn];
int p[maxn];
vector<pii> st[maxn];
bool chk(pii u,pii v,pii w){
	return (__int128)(w.se-u.se)*(u.fi-v.fi)<=(__int128)(v.se-u.se)*(u.fi-w.fi);
}
priority_queue<pair<int,pii>> q;
int calc(pii l,int x){return x*l.fi+l.se;}
int fd(int u,int x){
	int l=0,r=st[u].size()-1,res=0;
	while(l<r){
		int mid=l+r>>1;
		if(calc(st[u][mid],x)<=calc(st[u][mid+1],x))r=mid;
		else l=mid;
	}
	return calc(st[u][l],x);
}
void work(){
	n=read();k=read();
	for(int i=1;i<=k;i++)a[i]=read();
	for(int i=1;i<=k;i++)b[i]=read();
	for(int i=1;i<=k;i++){
		int len=read();
		e[i].resize(len),vis[i].resize(len),dis[i].resize(len);
		for(int j=0;j<len-1;j++){
			e[i][j]={read(),read()};
		}
		e[i][len-1].fi=read();
		for(int j=0;j<len;j++){
			pos[e[i][j].fi].pb({i,j});
			dis[i][j]=inf;
		}
	}
	for(int i=1;i<=n;i++)sort(pos[i].begin(),pos[i].end(),[&](pii u,pii v){return a[u.fi]<a[v.fi];});
	for(int i=0;i<pos[1].size();i++){
		dis[pos[1][i].fi][pos[1][i].se]=0;
		q.push({0,{pos[1][i].fi,pos[1][i].se}});
	}
	while(!q.empty()){
		int i=q.top().se.fi,j=q.top().se.se;q.pop();
		if(vis[i][j])continue;vis[i][j]=1;
		// cout<<i<<" "<<j<<" "<<dis[i][j]<<"\n";
		if(j+1<e[i].size()){
			if(dis[i][j+1]>dis[i][j]+e[i][j].se){
				dis[i][j+1]=dis[i][j]+e[i][j].se;
				q.push({-dis[i][j+1],{i,j+1}});
			}
		}
		int u=e[i][j].fi;
		if(!st[u].size()||b[i]<st[u].back().fi){
			while(st[u].size()>1&&chk(st[u][st[u].size()-2],st[u].back(),{b[i],dis[i][j]}))st[u].pop_back();
			st[u].pb({b[i],dis[i][j]});
		}
		// cout<<u<<" "<<st[u].size()<<"\n";
		while(p[u]<pos[u].size()&&vis[pos[u][p[u]].fi][pos[u][p[u]].se])p[u]++;
		if(p[u]<pos[u].size()){
			int v=fd(u,a[pos[u][p[u]].fi]);
			// cout<<u<<" "<<p[u]<<" "<<pos[u][p[u]].fi<<" "<<pos[u][p[u]].se<<" "<<v<<"\n";
			if(dis[pos[u][p[u]].fi][pos[u][p[u]].se]>v){
				dis[pos[u][p[u]].fi][pos[u][p[u]].se]=v;
				q.push({-dis[pos[u][p[u]].fi][pos[u][p[u]].se],{pos[u][p[u]].fi,pos[u][p[u]].se}});
			}
		}
	}
	for(int i=2;i<=n;i++){
		int res=inf;
		for(auto[id,j]:pos[i])res=min(res,dis[id][j]);
		printf("%lld ",res);
	}
}
// \
444

bool Med;
int T;
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	
//	cerr<<(&Mbe-&Med)/1048576.0<<" MB\n";
	
	T=1;
	while(T--)work();
}

详细

Test #1:

score: 100
Accepted
time: 4ms
memory: 34164kb

input:

6 3
1 5 1
5 5 1
3 1 2 2 3 3
3 5 1 2 1 4
3 3 4 5 4 6

output:

2 5 21 14 18 

result:

ok 5 number(s): "2 5 21 14 18"

Test #2:

score: 0
Accepted
time: 4ms
memory: 33452kb

input:

6 3
1 5 1
5 5 1
5 1 2 2 100 3 100 6 1 4
5 1 100 2 4 3 100 5 1 4
2 3 1 5

output:

2 31 43 37 136 

result:

ok 5 number(s): "2 31 43 37 136"

Test #3:

score: -100
Time Limit Exceeded

input:

5 9
278281 70119 511791 834898 25300 63487 609134 236836 394497
835557 287345 579404 879128 636344 306393 569430 152565 47119
2 3 823004250 4
2 1 25427550 3
2 1 15849621 3
2 1 701911826 5
3 5 679672631 3 907176714 2
2 1 817370554 2
2 3 697987914 2
2 4 873900795 2
2 1 814305954 5

output:


result: