QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#173052 | #2065. Cyclic Distance | KLPP# | RE | 0ms | 11644kb | C++20 | 2.6kb | 2023-09-09 21:45:13 | 2023-09-09 21:45:13 |
Judging History
answer
#include<iostream>
#include<vector>
#include<algorithm>
#include<cassert>
using namespace std;
typedef long long int lld;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define trav(a,v) for(auto a:v)
#pragma GCC optimize("-O3","unroll-loops")
#pragma GCC optimize("-Ofast")
vector<vector<pair<int,lld> > >nei;
lld dist[1000000];
bool vis[1000000];
int lab[1000000];
int n,k;
void DFS(int node, lld d=0, int label=-1){
dist[node]=d;
lab[node]=label;
trav(a,nei[node]){
if(dist[a.first]==-1){
if(label==-1)DFS(a.first,d+a.second,a.first);
else DFS(a.first,d+a.second,label);
}
}
}
void st(int node){
rep(i,0,n)dist[i]=-1;
DFS(node);
}
int sz[1000000];
bool bl[1000000];
void getsz(int node){
vis[node]=true;
sz[node]=1;
trav(a,nei[node]){
if(!vis[a.first] && !bl[a.first]){
getsz(a.first);
sz[node]+=sz[a.first];
}
}
}
int getcent(int node, int treesz){
trav(a,nei[node]){
if(!bl[a.first] && sz[node]>sz[a.first] && sz[a.first]*2>treesz){
return getcent(a.first,treesz);
}
}
return node;
}
void res(int node){
vis[node]=false;
trav(a,nei[node]){
if(!vis[a.first] && !bl[a.first]){
res(a.first);
}
}
}
int cnt[1000000];
vector<pair<lld,int> >V;
int tt[1000000];
int exc;
lld test(int node){
exc=-1;
st(node);
V.clear();
rep(i,0,n)cnt[i]=0,tt[i]=0;
rep(i,0,n){
V.push_back({-dist[i],lab[i]});
if(lab[i]>0)tt[lab[i]]++;
}
sort(V.begin(),V.end());
int tot=0;
lld ans=0;
trav(a,V){
if(tot==k)continue;
lld D=-a.first;
int v=a.second;
if(2*(cnt[v]+1)<=k && n-1-tt[v]>=cnt[v]+1){
cnt[v]++;
tot++;
ans+=2*D;
//cout<<D<<" "<<v<<" "<<tt[v]<<" "<<cnt[v]<<" "<<k<<endl;
}else{
exc=v;
}
}//cout<<endl;
if(tot<k)ans=-1;
return ans;
}
void solve(){
cin>>n>>k;
if(k==n)k--;
nei.clear();
nei.resize(n);
rep(i,0,n)bl[i]=false;
rep(i,0,n-1){
int x,y;
lld c;
cin>>x>>y>>c;
x--;y--;
nei[x].push_back({y,c});
nei[y].push_back({x,c});
}
lld ans=0;
rep(i,0,n)ans=max(ans,test(i));
//if(ans!=44 && k>4)assert(false);
cout<<ans<<"\n";
//~ int ver=0;
//~ while(true){
//~ if(bl[ver])break;
//~ rep(i,0,n)vis[i]=false;
//~ getsz(ver);
//~ int S=sz[ver];
//~ int cen=getcent(ver,S);
//~ res(cen);
//~ ans=max(ans,test(cen));
//~ if(exc==-1){
//~ cout<<ans<<"\n";
//~ return;
//~ }
//~ bl[cen]=true;
//~ ver=exc;
//~ }
//~ cout<<ans<<"\n";
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int tt=1;
cin>>tt;
if(tt>1)assert(false);
while(tt--){
solve();
}
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 11644kb
input:
1 5 3 1 2 4 1 3 1 1 4 8 4 5 9
output:
44
result:
ok single line: '44'
Test #2:
score: -100
Dangerous Syscalls
input:
57206 3 2 1 2 574927 2 3 406566 2 2 1 2 308806 4 3 1 2 312588 2 3 500141 2 4 53602 3 3 1 2 797183 2 3 944061 5 3 1 2 624010 2 3 488613 3 4 734514 4 5 497493 5 4 1 2 540278 2 3 488655 2 4 228989 2 5 653896 2 2 1 2 569117 4 2 1 2 821764 2 3 499471 1 4 549060 2 2 1 2 991159 2 2 1 2 482941 5 4 1 2 30462...