Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Knapsack DP is harder than FFT.
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll;
- #define ff first
- #define ss second
- #define pb emplace_back
- #define AI(x) begin(x),end(x)
- template<class I>bool chmax(I&a,I b){return a<b?(a=b,true):false;}
- template<class I>bool chmin(I&a,I b){return b<a?(a=b,true):false;}
- #ifdef OWO
- #define debug(args...) SDF(#args, args)
- #define OIU(args...) ostream& operator<<(ostream&O,args)
- #define LKJ(S,B,E,F) template<class...T>OIU(S<T...>s){O<<B;int c=0;for(auto i:s)O<<(c++?", ":"")<<F;return O<<E;}
- LKJ(vector,'[',']',i)LKJ(deque,'[',']',i)LKJ(set,'{','}',i)LKJ(multiset,'{','}',i)LKJ(unordered_set,'{','}',i)LKJ(map,'{','}',i.ff<<':'<<i.ss)LKJ(unordered_map,'{','}',i.ff<<':'<<i.ss)
- template<class...T>void SDF(const char* s,T...a){int c=sizeof...(T);if(!c){cerr<<"\033[1;32mvoid\033[0m\n";return;}(cerr<<"\033[1;32m("<<s<<") = (",...,(cerr<<a<<(--c?", ":")\033[0m\n")));}
- template<class T,size_t N>OIU(array<T,N>a){return O<<vector<T>(AI(a));}template<class...T>OIU(pair<T...>p){return O<<'('<<p.ff<<','<<p.ss<<')';}template<class...T>OIU(tuple<T...>t){return O<<'(',apply([&O](T...s){int c=0;(...,(O<<(c++?", ":"")<<s));},t),O<<')';}
- #else
- #pragma GCC optimize("Ofast")
- #define debug(...) ((void)0)
- #endif
- const int N = 200002;
- int n;
- ll k, ans;
- vector<pll> adj[N];
- bool vis[N];
- int siz[N];
- void getSize(int u, int p){
- siz[u] = 1;
- for(auto [v, _]: adj[u]){
- if(v == p or vis[v]) continue;
- getSize(v, u);
- siz[u] += siz[v];
- }
- }
- int getCen(int u, int p, int s){
- for(auto [v, _]: adj[u]){
- if(v == p or vis[v]) continue;
- if(siz[v] * 2 > s) return getCen(v, u, s);
- }
- return u;
- }
- vector<ll> tmp;
- ll sum[N], pmx[N];
- void treepre(int u, int p){
- for(auto [v, w]: adj[u]){
- if(v == p or vis[v]) continue;
- sum[v] = sum[u] + w;
- pmx[v] = max(pmx[u], sum[v]);
- treepre(v, u);
- }
- }
- void dfs(int u, int p){
- tmp.pb(pmx[u]);
- for(auto [v, w]: adj[u]){
- if(v == p or vis[v]) continue;
- dfs(v, u);
- }
- }
- ll getAns(int u){
- tmp.clear();
- dfs(u, 0);
- sort(AI(tmp));
- ll ret = 0;
- debug(u, tmp);
- for(int i = 0; i < tmp.size(); ++i){
- int j = lower_bound(begin(tmp) + i + 1, end(tmp), k - tmp[i]) - begin(tmp);
- ret += tmp.size() - j;
- }
- debug(u, ret);
- return ret;
- }
- void cenDecomp(int u, int p){
- getSize(u, p);
- int cen = getCen(u, p, siz[u]);
- debug(cen);
- sum[cen] = pmx[cen] = 0;
- treepre(cen, 0);
- ans += getAns(cen);
- vis[cen] = true;
- for(auto [v, w]: adj[cen]) if(!vis[v]) ans -= getAns(v);
- for(auto [v, _]: adj[cen]) if(!vis[v]) cenDecomp(v, cen);
- }
- signed main(){
- ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- cin >> n >> k;
- for(int i = 1, u, v, c; i < n; ++i){
- cin >> u >> v >> c;
- adj[u].pb(v, c);
- adj[v].pb(u, c);
- }
- cenDecomp(1, 0);
- cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement