# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
844705 | oneloveforever | 봉쇄 시간 (IOI23_closing) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//#include "closing.h"
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define ii pair<int,ll>
#define ll long long
int n,a,b;
ll k;
vector<vector<ii> >edge;
dfs(int x,int par,vector<ll>&dist)
{
for(ii need:edge[x])
{
int node=need.x;
int value=need.y;
if(node==par)continue;
dist[node]=dist[x]+value;
dfs(node,x,dist);
}
}
int Sub1(vector<ll>distX,vector<ll>distY)
{
vector<ll>que;
for(int i=0; i<=n-1; i++)
{
que.push_back(distX[i]);
que.push_back(distY[i]);
}
sort(que.begin(),que.end());
ll res=k;
int ans=0;
for(int value:que)
{
if(res<value)break;
res-=value;
ans++;
}
return ans;
}
int max_score(int N,int X,int Y,long long K,vector<int>U,vector<int>V,vector<int>W)
{
n=N;
a=X;
b=Y;
k=K;
edge.resize(n);
for(int i=1; i<=N-1; i++)
{
int x=U[i-1];
int y=V[i-1];
int value=W[i-1];
edge[x].push_back({y,value});
edge[y].push_back({x,value});
}
vector<ll>distX(n);
vector<ll>distY(n);
dfs(a,0,distX);
dfs(b,0,distY);
if(distX[b]>2*k)return Sub1(distX,distY);
}
/*signed main()
{
int n,x,y,k;
vector<int>U;
vector<int>V;
vector<int>W;
cin>>n>>x>>y>>k;
for(int i=1; i<=n-1; i++)
{
int x;
cin>>x;
U.push_back(x);
}
for(int i=1; i<=n-1; i++)
{
int y;
cin>>y;
V.push_back(y);
}
for(int i=1; i<=n-1; i++)
{
int value;
cin>>value;
W.push_back(value);
}
cout<<max_score(n,x,y,k,U,V,W);
}*/