Submission #99151

#TimeUsernameProblemLanguageResultExecution timeMemory
99151ShtefTransport (COCI19_transport)C++14
117 / 130
1031 ms21944 KiB
#include <iostream> #include <vector> #include <utility> #include <algorithm> using namespace std; typedef long long ll; typedef pair <int, ll> pil; #define x first #define y second #define mp make_pair ll a[100005], dolje[100005], gore[100005]; vector <pil> ms[100005]; bool bio[100005], je[100005]; int br, ss[100005], tu[100005], tam[100005], f[200005], n; vector <ll> b; const ll inf = (ll)1e15; void dfs1(int x, int p){ br++; ss[x] = 1; for(vector <pil>::iterator i = ms[x].begin() ; i != ms[x].end() ; ++i){ int o = (*i).x; if(o == p || bio[o]) continue; dfs1(o, x); ss[x] += ss[o]; } } int dfs2(int x, int p){ for(vector <pil>::iterator i = ms[x].begin() ; i != ms[x].end() ; ++i){ int o = (*i).x; if(o == p || bio[o]) continue; if(ss[o] > br / 2) return dfs2(o, x); } return x; } ll sol; void initdp(int x, int p, ll sad, ll maxi){ for(vector <pil>::iterator i = ms[x].begin() ; i != ms[x].end() ; ++i){ pil o = *i; if(o.x == p || bio[o.x]) continue; dolje[o.x] = max(sad - a[x] + o.y, dolje[x]); if(dolje[o.x] <= 0){ sol++; } b.push_back(dolje[o.x]); gore[o.x] = gore[x] + a[o.x] - o.y; je[o.x] = (gore[o.x] - maxi >= 0); if(je[o.x]){ sol++; } b.push_back(gore[o.x]); initdp(o.x, x, sad - a[x] + o.y, max(maxi, gore[o.x])); } } void dfs3(int x, int p){ if(p != -1){ tu[x] = lower_bound(b.begin(), b.end(), gore[x]) - b.begin() + 1; tam[x] = lower_bound(b.begin(), b.end(), dolje[x]) - b.begin() + 1; } for(vector <pil>::iterator i = ms[x].begin() ; i != ms[x].end() ; ++i){ int o = (*i).x; if(o == p || bio[o]) continue; dfs3(o, x); } } void update(int x, int y){ for(int i = x ; i <= 200001 ; i += (i & -i)){ f[i] += y; } } int sum(int x){ int ret = 0; for( ; x > 0 ; x -= (x & -x)){ ret += f[x]; } return ret; } void dfs4(int x, int p, int add){ if(p != -1){ update(tam[x], add); } for(vector <pil>::iterator i = ms[x].begin() ; i != ms[x].end() ; ++i){ int o = (*i).x; if(o == p || bio[o]) continue; dfs4(o, x, add); } } ll dfs5(int x, int p){ ll ret = 0; if(je[x]){ ret += sum(tu[x]); } for(vector <pil>::iterator i = ms[x].begin() ; i != ms[x].end() ; ++i){ int o = (*i).x; if(o == p || bio[o]) continue; ret += dfs5(o, x); } return ret; } void decompose(int root){ br = 0; dfs1(root, -1); int centroid = dfs2(root, -1); bio[centroid] = 1; dolje[centroid] = -inf; gore[centroid] = 0; b.clear(); initdp(centroid, -1, 0, 0); b.push_back(0LL); sort(b.begin(), b.end()); b.resize(unique(b.begin(), b.end()) - b.begin()); /* for(int i = 0 ; i < (int)b.size() ; ++i){ cout << b[i] << ":"; } cout << " . "; */ dfs3(centroid, -1); dfs4(centroid, -1, 1); //cout << centroid << " - "; for(vector <pil>::iterator i = ms[centroid].begin() ; i != ms[centroid].end() ; ++i){ pil o = *i; if(bio[o.x]) continue; dfs4(o.x, centroid, -1); sol += dfs5(o.x, centroid); //cout << "[" << dfs5(o.x, centroid) << "] "; dfs4(o.x, centroid, 1); } //cout << endl; dfs4(centroid, -1, -1); for(vector <pil>::iterator i = ms[centroid].begin() ; i != ms[centroid].end() ; ++i){ int o = (*i).x; if(bio[o]) continue; decompose(o); } } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; for(int i = 1 ; i <= n ; ++i){ cin >> a[i]; } for(int i = 0 ; i < n - 1 ; ++i){ int x, y; ll w; cin >> x >> y >> w; ms[x].push_back(mp(y, w)); ms[y].push_back(mp(x, w)); } decompose(1); cout << sol << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...