Submission #968110
Source Code Expand
#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define REP(i,b) FOR(i,0,b)
#define MP make_pair
#define PB push_back
#define REACH cerr<<"reached line "<<__LINE__<<endl
#define DBG(x) cerr<<"line "<<__LINE__<<" "<<#x<<":"<<x<<endl
using uint=unsigned int;
using ll=long long;
using pii=pair<int,int>;
using vi=vector<int>;
using ld=long double;
template<class T,class U>
ostream& operator<<(ostream& os,const pair<T,U>& p){
os<<"("<<p.first<<","<<p.second<<")";
return os;
}
template<class T>
ostream& operator <<(ostream& os,const vector<T>& v){
os<<"[";
REP(i,(int)v.size()){
if(i)os<<",";
os<<v[i];
}
os<<"]";
return os;
}
int read(){
int i;
scanf("%d",&i);
return i;
}
ll readLL(){
ll i;
scanf("%lld",&i);
return i;
}
string readString(){
static char buf[3341919];
scanf("%s",buf);
return string(buf);
}
char* readCharArray(){
static char buf[3341919];
static int bufUsed=0;
char* ret=buf+bufUsed;
scanf("%s",ret);
bufUsed+=strlen(ret)+1;
return ret;
}
template<class T,class U>
void chmax(T& a,U b){
if(a<b)
a=b;
}
template<class T,class U>
void chmin(T& a,U b){
if(a>b)
a=b;
}
template<class T>
T Sq(const T& t){
return t*t;
}
const int Nmax=114514;
struct Edge{
int to,dist,idx;
};
vector<Edge> tree[Nmax];
bool vRem[Nmax];
int TreeSize(int v,int p){
int ret=1;
for(auto e:tree[v])if(e.to!=p&&!vRem[e.to])
ret+=TreeSize(e.to,v);
return ret;
}
int FindCentroid(int v,int p,int s){
int ret=1,mx=0;
for(auto e:tree[v])if(e.to!=p&&!vRem[e.to]){
int f=FindCentroid(e.to,v,s);
if(f<=0)
return f;
else{
ret+=f;
mx=max(mx,f);
}
}
mx=max(mx,s-ret);
if(mx*2<=s)
return -v;
else
return ret;
}
void Waf(int v,int p,ll d,vector<ll>& dst){
dst.PB(d);
for(auto e:tree[v])if(e.to!=p&&!vRem[e.to])
Waf(e.to,v,d+e.dist,dst);
}
pair<ll,ll> Solve(int root,ll x){
int ts=TreeSize(root,-1);
if(ts==1)
return MP(0LL,0LL);
root=-FindCentroid(root,-1,ts);
vector<vector<ll>> ds,dsSum;
vector<ll> k,kSum;
for(auto e:tree[root])if(!vRem[e.to]){
vector<ll> dst;
Waf(e.to,root,e.dist,dst);
ds.PB(dst);
for(auto v:dst)
k.PB(v);
}
ll f=0,s=0;
for(auto& d:ds){
sort(d.begin(),d.end());
dsSum.PB(d);
ll last=0;
for(auto& v:dsSum.back())
last=v=v+last;
}
sort(k.begin(),k.end());
{
kSum=k;
ll last=0;
for(auto& v:kSum)
last=v=v+last;
}
int j=0;
for(auto& d:ds){
for(auto v:d){
{
int i=lower_bound(k.begin(),k.end(),x-v)-k.begin();
if(i>0){
f+=kSum[i-1]+v*i;
s+=i;
}
}
{
int i=lower_bound(d.begin(),d.end(),x-v)-d.begin();
if(i>0){
f-=dsSum[j][i-1]+v*i;
s-=i;
}
}
}
j++;
}
f/=2;
s/=2;
{
int i=lower_bound(k.begin(),k.end(),x)-k.begin();
if(i>0){
f+=kSum[i-1];
s+=i;
}
}
vRem[root]=true;
for(auto e:tree[root])if(!vRem[e.to]){
auto g=Solve(e.to,x);
f+=g.first;
s+=g.second;
}
return MP(f,s);
}
int edgeMin[Nmax];
int main(){
int n=read(),x=read();
REP(_,n-1){
int a=read()-1,b=read()-1,c=read();
tree[a].PB(Edge{b,c,_});
tree[b].PB(Edge{a,c,_});
edgeMin[_]=c;
}
ll ans=ll(x)*n*(n-1)/2;
auto s=Solve(0,x);
ans-=s.second*x;
ans+=s.first;
REP(v,n){
ll i=LLONG_MAX/3;
for(auto e:tree[v])
chmin(i,e.dist);
for(auto e:tree[v]){
if(e.dist>x){
if(int(tree[v].size()+tree[e.to].size())-2<n-2)
chmin(edgeMin[e.idx],x*2);
chmin(edgeMin[e.idx],i+x);
}
}
}
ll bias=0;
REP(v,n){
for(auto e:tree[v]){
if(edgeMin[e.idx]>x){
bias+=edgeMin[e.idx]-x;
}
}
}
bias/=2;
cout<<ans+bias<<endl;
}
Submission Info
Submission Time
2016-11-05 21:47:51+0900
Task
D - 道路網
User
maroonrk
Language
C++14 (GCC 5.4.1)
Score
1200
Code Size
3791 Byte
Status
AC
Exec Time
341 ms
Memory
21936 KB
Compile Error
./Main.cpp: In function ‘int read()’:
./Main.cpp:36:16: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&i);
^
./Main.cpp: In function ‘ll readLL()’:
./Main.cpp:42:18: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld",&i);
^
./Main.cpp: In function ‘std::string readString()’:
./Main.cpp:48:17: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%s",buf);
^
./Main.cpp: In function ‘char* readCharArray()’:
./Main.cpp:56:17: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%s",ret);
^
Judge Result
Set Name
Sample
All
Score / Max Score
0 / 0
1200 / 1200
Status
Set Name
Test Cases
Sample
00_example_01.txt, 00_example_02.txt
All
00_example_01.txt, 00_example_02.txt, 10_rand_01.txt, 10_rand_02.txt, 10_rand_03.txt, 10_rand_04.txt, 10_rand_05.txt, 20_k-ary_01.txt, 20_k-ary_02.txt, 20_k-ary_03.txt, 20_k-ary_04.txt, 20_k-ary_05.txt, 20_k-ary_06.txt, 20_k-ary_07.txt, 20_k-ary_08.txt, 20_k-ary_09.txt, 20_k-ary_10.txt, 30_star_01.txt, 30_star_02.txt, 30_star_03.txt, 30_star_04.txt, 30_star_05.txt, 40_pseudostar_01.txt, 40_pseudostar_02.txt, 40_pseudostar_04.txt, 40_pseudostar_05.txt, 40_pseudostar_06.txt, 50_line_01.txt, 50_line_02.txt, 50_line_03.txt, 60_max_01.txt, 60_max_02.txt, 60_max_03.txt, 60_max_04.txt, 70_hand_01.txt, 70_hand_02.txt, 71_hand_01.txt, 72_hand_01.txt, 80_kill2X_01.txt, 80_kill2X_02.txt, 80_kill2X_03.txt, 80_kill2X_04.txt, 80_kill2X_05.txt, 80_kill2X_06.txt, 80_kill2X_07.txt, 80_kill2X_08.txt
Case Name
Status
Exec Time
Memory
00_example_01.txt
AC
5 ms
2944 KB
00_example_02.txt
AC
5 ms
2944 KB
10_rand_01.txt
AC
5 ms
2944 KB
10_rand_02.txt
AC
6 ms
2944 KB
10_rand_03.txt
AC
6 ms
2944 KB
10_rand_04.txt
AC
6 ms
2944 KB
10_rand_05.txt
AC
6 ms
2944 KB
20_k-ary_01.txt
AC
310 ms
13296 KB
20_k-ary_02.txt
AC
310 ms
13296 KB
20_k-ary_03.txt
AC
311 ms
13424 KB
20_k-ary_04.txt
AC
209 ms
13984 KB
20_k-ary_05.txt
AC
163 ms
13132 KB
20_k-ary_06.txt
AC
106 ms
12476 KB
20_k-ary_07.txt
AC
97 ms
12064 KB
20_k-ary_08.txt
AC
93 ms
11252 KB
20_k-ary_09.txt
AC
93 ms
10996 KB
20_k-ary_10.txt
AC
93 ms
11124 KB
30_star_01.txt
AC
94 ms
20528 KB
30_star_02.txt
AC
99 ms
20528 KB
30_star_03.txt
AC
98 ms
20528 KB
30_star_04.txt
AC
99 ms
20528 KB
30_star_05.txt
AC
99 ms
20528 KB
40_pseudostar_01.txt
AC
95 ms
20528 KB
40_pseudostar_02.txt
AC
105 ms
21040 KB
40_pseudostar_04.txt
AC
108 ms
21920 KB
40_pseudostar_05.txt
AC
108 ms
21936 KB
40_pseudostar_06.txt
AC
106 ms
21904 KB
50_line_01.txt
AC
338 ms
20660 KB
50_line_02.txt
AC
341 ms
20660 KB
50_line_03.txt
AC
341 ms
20660 KB
60_max_01.txt
AC
294 ms
13464 KB
60_max_02.txt
AC
289 ms
13088 KB
60_max_03.txt
AC
248 ms
13312 KB
60_max_04.txt
AC
274 ms
13332 KB
70_hand_01.txt
AC
5 ms
2944 KB
70_hand_02.txt
AC
5 ms
2944 KB
71_hand_01.txt
AC
258 ms
13336 KB
72_hand_01.txt
AC
335 ms
20660 KB
80_kill2X_01.txt
AC
95 ms
20528 KB
80_kill2X_02.txt
AC
95 ms
20528 KB
80_kill2X_03.txt
AC
95 ms
20528 KB
80_kill2X_04.txt
AC
97 ms
20528 KB
80_kill2X_05.txt
AC
106 ms
21936 KB
80_kill2X_06.txt
AC
100 ms
21904 KB
80_kill2X_07.txt
AC
101 ms
21728 KB
80_kill2X_08.txt
AC
102 ms
21916 KB