QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#799537 | #9352. Highway Buses | BINYU | WA | 8ms | 70412kb | C++14 | 3.0kb | 2024-12-05 15:36:31 | 2024-12-05 15:36:31 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair <int,int>
#define pli pair <ll,int>
#define fi first
#define se second
const int N = 2e5,M = 50;
int n,m,T,u,v,cnt,a[N + 5],b[N + 5],f[N + 5],vis[N + 5],siz[N + 5];
ll c[N + 5],w[N + 5],d[N + 5],ans[N + 5],C[N + 5];
vector <int> e[N + 5],E[N + 5];
priority_queue <pli,vector <pli>,greater <pli> > q;
int dis[M + 5][N + 5],t1[M + 5],t2[N + 5];
vector <pii> c1[M + 5],c2[N + 5];
map <int,int> mp[N + 5];
struct DSU
{
int f[N + 5];
void init(int n)
{
for(int i = 1;i <= n;i++)f[i] = i;
}
int fnd(int x)
{
return x == f[x] ? x : f[x] = fnd(f[x]);
}
bool merge(int x,int y)
{
x = fnd(x);y = fnd(y);
if(x == y)return 0;
f[x] = y;
return 1;
}
}dsu;
int get_siz(int u,int fa)
{
siz[u] = 1;
for(auto v : e[u])
if(!vis[v]&&v != fa)
siz[u] += get_siz(v,u);
return siz[u];
}
int get_root(int u,int fa,int Siz)
{
int mx = Siz - siz[u],rt = -1;
for(auto v : e[u])
if(!vis[v]&&v != fa)
mx = max(mx,siz[v]),
rt = max(rt,get_root(v,u,Siz));
if(mx * 2 <= Siz)return u;
return rt;
}
void init(int st,int *dis,vector <pii> &c,int op)
{
for(int i = 1;i <= n;i++)dis[i] = 0;
queue <int> q;q.push(st);
while(!q.empty())
{
int u = q.front();q.pop();
c.push_back({dis[u],u});
if(op)mp[st][u] = dis[u];
for(auto v : e[u])
{
if(v != st&&!dis[v]&&!vis[v])
dis[v] = dis[u] + 1,q.push(v);
}
}
}
int solve(int u)
{
vis[u] = 1;init(u,dis[0],c2[u],1);
for(auto v : e[u])
if(!vis[v])
f[solve(get_root(v,u,get_siz(v,u)))] = u;
return u;
}
void dij(int x)
{
for(int i = 1;i <= n;i++)C[i] = c[i] + w[i] * x,t1[i] = t2[i] = 0;
memset(vis,0,sizeof(vis));
q.push({0 + C[1],1});vis[1] = 1;
while(!q.empty())
{
int u = q.top().second;q.pop();
for(int i = 1;i <= cnt;i++)
{
while(t1[i] != c1[i].size())
{
int v = c1[i][t1[i]].second;
if(c1[i][t1[i]].first + dis[i][u] > b[u])break;
if(!vis[v])
d[v] = d[u] + C[u],vis[v] = 1,
q.push({d[v] + c[v],v});
t1[i]++;
}
}
int now = u;
while(now)
{
while(t2[now] != c2[now].size())
{
int v = c2[now][t2[now]].second;
if(c2[now][t2[now]].first + mp[now][u] > b[u])break;
if(!vis[v])
d[v] = d[u] + C[u],vis[v] = 1,
q.push({d[v] + c[v],v});
t2[now]++;
}
now = f[now];
}
}
for(int i = 1;i <= n;i++)ans[i] = min(ans[i],d[i]);
}
int main()
{
scanf("%d %d %d",&n,&m,&T);dsu.init(n);
for(int i = 1;i <= n;i++)
scanf("%d %lld %lld",&b[i],&c[i],&w[i]);
for(int i = 1;i <= m;i++)
{
scanf("%d %d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
if(dsu.merge(u,v))
E[u].push_back(v),E[v].push_back(u);
else a[++cnt] = u;
}
for(int i = 1;i <= cnt;i++)init(a[i],dis[i],c1[i],0);
for(int i = 1;i <= n;i++)swap(E[i],e[i]);
solve(get_root(1,0,get_siz(1,0)));
memset(ans,0x3f,sizeof(ans));
dij(0);dij(T - 1);
for(int i = 1;i <= n;i++)cout<<ans[i]<<"\n";
}
詳細信息
Test #1:
score: 100
Accepted
time: 3ms
memory: 39404kb
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:
0 10 52 52 52 10
result:
ok 6 lines
Test #2:
score: -100
Wrong Answer
time: 8ms
memory: 70412kb
input:
500 540 1000000 1 831790353 70 3 624594642 -127 2 189318946 -92 1 858646508 320 4 76999645 671 4 780012318 880 2 51254764 -12 2 420182468 -333 3 314764053 -36 1 560114854 -419 2 484412868 -31 3 466851594 6 4 535326027 732 4 430602789 578 1 605236859 43 4 633715178 896 3 110060408 -9 4 878946915 -654...
output:
0 1615624558 1542544819 1662548163 1474648686 1539102708 1570810517 1615624558 1539102708 1615624558 1539102708 1496782021 1634729968 1539102708 1539102708 1539102708 1552487755 1542544819 1841411333 1542544819 1539102708 1615624558 1539102708 1510170699 1754364477 1680870556 1546066466 1518054248 1...
result:
wrong answer 2nd lines differ - expected: '1277292628', found: '1615624558'