QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#860352 | #9569. Subway | lunchbox | WA | 2ms | 29464kb | C++17 | 2.5kb | 2025-01-18 12:46:12 | 2025-01-18 12:46:12 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=2e5,K=2e5,M=2e5;
const ll INF=4e18;
int n,k,a[K],b[K];
int m;
int w[M],uu[M],vv[M],ne[M],id[M];
bool done[M];
vector<int>from[N],to[N];
ll d[M];
using line=array<ll,2>;
ll ev(const line&l,ll x){return l[0]+l[1]*x;}
const line unit{INF,0};
struct S{
vector<int>e;
ll x(int i){return a[id[e.at(i)]];}
int n,pt;
vector<line>st;
void init(vector<int>e_){
if(e_.empty()){n=0;return;}
e=e_,n=e.size(),pt=0;
sort(e.begin(),e.end(),[&](int i,int j){return a[id[i]]<a[id[j]];});
st.assign(n*4,unit);
}
void add(int k,int l,int r,line v){
int m=(l+r)/2;
if(ev(v,x(m))<ev(st[k],x(m)))swap(st[k],v);
if(l<r&&v[1]!=st[k][1])v[1]>st[k][1]?add(k*2,l,m,v):add(k*2+1,m+1,r,v);
}
void add(line x){if(n)add(1,0,n-1,x);}
ll qry(int k,int l,int r,int i){
if(l==r)return ev(st[k],x(i));
int m=(l+r)/2;
return min(ev(st[k],x(i)),i<=m?qry(k*2,l,m,i):qry(k*2+1,m+1,r,i));
}
ll get(){return qry(1,0,n-1,pt);}
int who(){return pt<n?e.at(pt):-1;}
void adv(){pt++;}
}ds[N];
int main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n>>k;
for(int i=0;i<k;i++)cin>>a[i];
for(int i=0;i<k;i++)cin>>b[i];
m=0;
for(int i=0;i<k;i++){
int p;
cin>>p;
int u;
cin>>u,u--;
int e=-1;
for(int j=0;j<p-1;j++){
int c,v;
cin>>c>>v,v--;
if(~e)ne[e]=m;
from[u].push_back(m),to[v].push_back(m);
uu[m]=u,vv[m]=v,w[m]=c,id[m]=i;
u=v,e=m++;
}
assert(~e);
ne[e]=-1;
}
for(int i=0;i<n;i++)ds[i].init(from[i]);
for(int i=0;i<m;i++)d[i]=INF;
priority_queue<pair<ll,int>>pq;
auto upd=[&](int i,ll x){
if(d[i]>x)pq.push({-(d[i]=x),i});
};
auto work=[&](int v){
while(~ds[v].who()&&done[ds[v].who()])ds[v].adv();
if(~ds[v].who())upd(ds[v].who(),ds[v].get());
};
for(int i:from[0])upd(i,0);
while(pq.size()){
auto [x,i]=pq.top();
pq.pop(),x*=-1;
if(done[i])continue;
done[i]=1;
int u=uu[i],v=vv[i];
ds[u].add({x,b[id[i]]});
if(~ne[i])upd(ne[i],x+w[i]);
work(u);
}
for(int i=1;i<n;i++){
ll x=INF;
for(int j:from[i])x=min(x,d[j]);
for(int j:to[i])x=min(x,d[j]+w[j]);
cout<<x<<' ';
}
cout<<'\n';
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 2ms
memory: 29464kb
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 28 4000000000000000000 4000000000000000000
result:
wrong answer 3rd numbers differ - expected: '21', found: '28'