QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#717730 | #9352. Highway Buses | Xinyoucuo1dui# | WA | 3ms | 13896kb | C++23 | 5.4kb | 2024-11-06 18:49:43 | 2024-11-06 18:49:44 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
long long a,b,c,an[300001],de[300001],cnt,vi[300001],g[300001],vv[300001],st[300001],cn,q,w,h[10000001];
struct p{long long q,w;bool operator < (const p &aa) const{return w>aa.w;};}l[300001];
vector<p> qu[300001],qu1[300001],qu2[300001];
queue<int> quu;
void dfs(int qq,int ww)
{
vv[qq]=1;
for(int i=0;i<qu1[qq].size();i++)
{
if(vv[qu1[qq][i].q]) continue;
vi[qu1[qq][i].w]=1;
dfs(qu1[qq][i].q,qq);
}
}
vector<int> tmp;
void dfs1(int qq)
{
vi[qq]=1;tmp.push_back(qq);
for(int i=0;i<qu1[qq].size();i++)
{
if(vi[qu1[qq][i].q]) continue;
dfs1(qu1[qq][i].q);
}
}
int di[103][200001];
long long si[200001],v[200001],all,mx=1e9,rt,mxd;
void dfs2(int qq,int ww)
{
long long mxx=0;si[qq]=1;
for(int i=0;i<qu2[qq].size();i++)
{
if(qu2[qq][i].q==ww) continue;
if(v[qu2[qq][i].q]) continue;
dfs2(qu2[qq][i].q,qq);
si[qq]+=si[qu2[qq][i].q];
mxx=max(mxx,si[qu2[qq][i].q]);
}
mxx=max(mxx,all-si[qq]);
if(mxx<mx) mx=mxx,rt=qq;
}
vector<int> ve[300001];
void dfs3(int qq,int ww)
{
de[qq]=de[ww]+1;mxd=max(mxd,de[qq]);
ve[de[qq]].push_back(qq);
for(int i=0;i<qu2[qq].size();i++)
{
if(qu2[qq][i].q==ww||v[qu2[qq][i].q]) continue;
dfs3(qu2[qq][i].q,qq);
}
}
int h1[10000001],o;
struct pp{int q,w;}l1[40000001];
long long t[300001],ls[300001];
void add(int qq,int ww)
{
l1[++o].q=ww,l1[o].w=h1[qq],h1[qq]=o;
}
void link(int qq,int ww,long long ee)
{
if(ee<0) return;
++ee;
ee=min(ee,t[ww]);
add(qq,ls[ee]);
}
void work(int qq)
{
mxd=0;
dfs3(qq,0);
int lss=0;t[qq]=mxd;
for(int i=1;i<=mxd;i++)
{
++cnt;
ls[i]=cnt;
if(lss) add(cnt,lss);
for(int j=0;j<ve[i].size();j++) add(cnt,ve[i][j]);
lss=cnt;
}
for(int i=1;i<=mxd;i++)
{
for(int j=0;j<ve[i].size();j++)
{
// cout<<ve[i][j]<<" "<<qq<<" "<<l[ve[i][j]].q-(i-1)<<"\n";
link(ve[i][j],qq,l[ve[i][j]].q-(i-1));
}
}
for(int i=1;i<=mxd;i++) ve[i].clear();
}
void solve(int qq)
{
// cout<<all<<" "<<mx<<"\n";
work(qq);v[qq]=1;
for(int i=0;i<qu2[qq].size();i++)
{
int tt=qu2[qq][i].q;
if(v[tt]) continue;
// cout<<all<<" ";
all=si[tt],mx=1e9,rt=0;
dfs2(tt,qq);
solve(rt);
}
}
void work(vector<int> qq)
{
// cout<<qq.size()<<" "<<cnt<<" "<<o<<"\n";
// for(int i=0;i<qq.size();i++) cout<<qq[i]<<" ";cout<<"\n";
for(int i=0;i<qq.size();i++) vv[qq[i]]=1;
all=0;
for(int i=0;i<qq.size();i++)
{
int tt=qq[i];v[tt]=0;all++;
qu2[tt].clear();
for(int j=0;j<qu1[tt].size();j++)
{
if(vv[qu1[tt][j].q]) qu2[tt].push_back(qu1[tt][j]);
}
}
mx=1e9;rt=0;
dfs2(tmp[0],0);
// cout<<all<<" "<<mx<<"\n";
solve(rt);
for(int i=0;i<qq.size();i++) vv[qq[i]]=0;
}
priority_queue<p> Qu;
void work()
{
while(!Qu.empty()) Qu.pop();
Qu.push(p{1,l[1].w});
for(int i=1;i<=cnt;i++) h[i]=-1;
h[1]=l[1].w;
while(!Qu.empty())
{
int r=Qu.top().q;Qu.pop();
// cout<<r<<" ";
for(int i=h1[r];i;i=l1[i].w)
{
int tt=l1[i].q;
if(h[tt]==-1)
{
if(tt>a) h[tt]=h[r];
else h[tt]=h[r]+l[tt].w;
Qu.push(p{tt,h[tt]});
}
}
}
for(int i=1;i<=a;i++) an[i]=min(an[i],h[i]-l[i].w);
}
long long mxxd;
void dfs4(int qq,int ww)
{
de[qq]=de[ww]+1;ve[de[qq]-1].push_back(qq);//mxdd=max(mxdd,de[qq]-1);
for(int i=0;i<qu1[qq].size();i++)
{
if(qu1[qq][i].q==ww||vi[qu1[qq][i].q]) continue;
dfs4(qu1[qq][i].q,qq);
}
}
int main()
{
freopen("1.in","r",stdin);
scanf("%lld%lld%lld",&a,&b,&c);
for(int i=1;i<=a;i++)
{
scanf("%lld%lld%lld",&l[i].q,&l[i].w,&g[i]);
}
for(int i=1;i<=b;i++)
{
scanf("%lld%lld",&q,&w);
qu[q].push_back(p{w,i});
qu[w].push_back(p{q,i});
}
cnt=a+b;
for(int i=1;i<=cnt;i++) vi[i]=0,vv[i]=0;
cnt=a;
for(int i=1;i<=a;i++) qu1[i]=qu[i];
for(int i=1;i<=a;i++) de[i]=0;
dfs(1,0);cn=0;
for(int i=1;i<=a;i++)
{
for(int j=0;j<qu1[i].size();j++)
{
if(!vi[qu1[i][j].w])
{
st[++cn]=i;
}
}
}
sort(st+1,st+cn+1);cn=unique(st+1,st+cn+1)-st-1;
// for(int i=1;i<=cn;i++) cout<<st[i]<<" ";cout<<"\n";
for(int i=1;i<=a;i++) vi[i]=0,vv[i]=0;
for(int i=1;i<=cn;i++) vi[st[i]]=1;
for(int i=1;i<=cn;i++)
{
for(int j=1;j<=a;j++) di[i][j]=-1;
di[i][st[i]]=0;
while(!quu.empty()) quu.pop();
quu.push(st[i]);
while(!quu.empty())
{
int r=quu.front();quu.pop();
for(int j=0;j<qu1[r].size();j++)
{
if(di[i][qu1[r][j].q]==-1)
{
di[i][qu1[r][j].q]=di[i][r]+1;
quu.push(qu1[r][j].q);
}
}
}
}
// cout<<cnt<<" "<<o;return 0;
for(int i=1;i<=a;i++) an[i]=1e18;
for(int i=1;i<=a;i++)
{
if(!vi[i])
{
tmp.clear();
dfs1(i);
work(tmp);
}
}
for(int i=1;i<=a;i++) vi[i]=0;
for(int i=1;i<=cn;i++) vi[st[i]]=1;
for(int i=1;i<=cn;i++)
{
for(int j=0;j<=a;j++) ve[j].clear();
dfs4(st[i],0);
for(int j=1;j<=cn;j++)
{
if(i==j) continue;
ve[di[i][st[j]]].push_back(st[j]);
}
long long mxx=0;
for(int j=0;j<=a;j++)
{
if(!ve[j].size()) break;
mxx=j;
++cnt;ls[j]=cnt;
if(j>0) add(ls[j],ls[j-1]);
for(int k=0;k<ve[j].size();k++)
{
add(ls[j],ve[j][k]);
}
}
for(int j=1;j<=a;j++)
{
long long nww=l[j].q-di[i][j];
nww=min(nww,mxx);
if(nww>=0)
{
add(j,ls[nww]);
}
}
}
// cout<<cnt<<" "<<o;return 0;
work();
for(int i=1;i<=a;i++)
{
l[i].w+=g[i]*(c-1);
}
work();
for(int i=1;i<=a;i++) printf("%lld\n",an[i]);
return 0;
}
详细
Test #1:
score: 0
Wrong Answer
time: 3ms
memory: 13896kb
input:
6 6 2 1 50 -40 1 2 100 2 1 100 2 4 100 3 1 100 1 1 100 1 2 2 3 3 4 4 2 2 5 6 1
output:
result:
wrong answer 1st lines differ - expected: '0', found: ''