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
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
AC × 2
AC × 46
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