QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#733859 | #9569. Subway | yhddd | TL | 4ms | 34164kb | C++14 | 2.9kb | 2024-11-10 21:38:44 | 2024-11-10 21:38:44 |
Judging History
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();
}
Details
Tip: Click on the bar to expand more detailed information
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