이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "closing.h"
using namespace std;
#include <bits/stdc++.h>
#define pb push_back
using lli=long long;
#define deb(x) cout<<#x<<": "<<x<<endl;
int max_score(int N, int X, int Y, long long K,
vector<int> U, vector<int> V, vector<int> W)
{
if(N>500){
vector<vector<pair<lli,lli>>> adj (N);
for(lli i=0; i<N-1; ++i){
adj[U[i]].pb({W[i], V[i]});
adj[V[i]].pb({W[i], U[i]});
}
priority_queue<pair<lli,lli>, vector<pair<lli,lli>>, greater<pair<lli,lli>>> pq;
pq.push({0, X});
pq.push({0,Y});
vector<bool> visited (N, false);
int ans=0;
while(!pq.empty()){
lli a=pq.top().first;
lli b=pq.top().second;
pq.pop();
if(visited[b]) continue;
if(K<a) break;
visited[b]=true;
ans++;
K-=a;
for(lli i=0; i<adj[b].size(); ++i){
if(!visited[adj[b][i].second]){
pq.push({adj[b][i].first+a, adj[b][i].second});
}
}
}
return ans;
}
int ans=0;
vector<vector<pair<lli,lli>>> adj (N);
vector<vector<lli>> mat (N, vector<lli> (N, -1));
for(lli i=0; i<N-1; ++i){
adj[U[i]].pb({W[i], V[i]});
adj[V[i]].pb({W[i], U[i]});
mat[U[i]][V[i]]=W[i];
mat[V[i]][U[i]]=W[i];
}
int ini=0;
int ant=0;
while(adj[ini].size()!=1){
if(adj[ini][0].second!=ant){
ant=ini;
ini=adj[ini][0].second;
}
else{
ant=ini;
ini=adj[ini][1].second;
}
}
int last=adj[ini][0].second;
ant=ini;
while(adj[last].size()!=1){
if(adj[last][0].second!=ant){
ant=last;
last=adj[last][0].second;
}
else{
ant=last;
last=adj[last][1].second;
}
}
vector<int> ord;
ord.pb(ini);
int rec=adj[ini][0].second;
while(rec!=last){
ord.pb(rec);
if(adj[rec][0].second!=ord[ord.size()-2]){
rec=adj[rec][0].second;
}
else{
rec=adj[rec][1].second;
}
}
ord.pb(rec);
vector<int> pos (N);
for(int i=0; i<N; ++i){
pos[ord[i]]=i;
}
for(int i=pos[X]; i>=0; --i){
vector<int> values(N,0);
lli cant=K;
for(lli a=pos[X]-1; a>=i; --a){
values[a]=values[a+1]+mat[ord[a]][ord[a+1]];
cant-=values[a];
}
lli help=cant;
if(cant<0) break;
for(lli j=pos[X]; j<N; ++j){
cant=help;
if(j!=pos[X]){
values[j]=values[j-1]+mat[ord[j]][ord[j-1]];
help-=values[j];
cant-=values[j];
}
if(cant<0) break;
priority_queue<pair<pair<lli,lli>, lli>, vector<pair<pair<lli,lli>, lli>>, greater<pair<pair<lli,lli>, lli>>> pq;
pq.push({{0,0}, pos[Y]});
int aux=j-i+1;
vector<bool> visited(N, false);
while(!pq.empty()){
lli a=pq.top().first.first;
lli b=pq.top().first.second;
lli c=pq.top().second;
pq.pop();
if(visited[c]) continue;
visited[c]=true;
if(cant<a) break;
aux++;
cant-=a;
if(c+1<N && !visited[c+1]){
pq.push({{max(b+mat[ord[c]][ord[c+1]]-values[c+1],0ll), b+mat[ord[c]][ord[c+1]]}, c+1});
}
if(c-1>=0 && !visited[c-1]){
pq.push({{max(b+mat[ord[c]][ord[c-1]]-values[c-1],0ll), b+mat[ord[c]][ord[c-1]]}, c-1});
}
}
ans=max(ans,aux );
}
}
return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
closing.cpp: In function 'int max_score(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:31:23: warning: comparison of integer expressions of different signedness: 'lli' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
31 | for(lli i=0; i<adj[b].size(); ++i){
| ~^~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |