QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#172978 | #2065. Cyclic Distance | KLPP# | RE | 2ms | 9820kb | C++20 | 2.3kb | 2023-09-09 21:28:38 | 2023-09-09 21:28:39 |
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 exc;
lld test(int node){
exc=-1;
st(node);
V.clear();
rep(i,0,n)cnt[i]=0;
rep(i,0,n){
V.push_back({-dist[i],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){
cnt[v]++;
tot++;
ans+=2*D;
}else{
exc=v;
}
}
return ans;
}
void solve(){
cin>>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>2)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;
while(tt--){
solve();
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 2ms
memory: 9820kb
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...