Submission #47636

#TimeUsernameProblemLanguageResultExecution timeMemory
47636WA_TLEBeads and wires (APIO14_beads)C++14
0 / 100
2 ms384 KiB
#include<deque> #include<queue> #include<vector> #include<algorithm> #include<iostream> #include<set> #include<cmath> #include<tuple> #include<string> #include<chrono> #include<functional> #include<iterator> #include<random> #include<unordered_set> #include<array> #include<map> #include<iomanip> #include <assert.h> using namespace std; typedef long long int llint; typedef long double lldo; #define mp make_pair #define mt make_tuple #define pub push_back #define puf push_front #define pob pop_back #define pof pop_front #define fir first #define sec second #define res resize #define ins insert #define era erase //cout<<setprecision(20) //cin.tie(0); //ios::sync_with_stdio(false); const llint mod=1000000007; const llint big=2.19e15+1; const long double pai=3.141592653589793238462643383279502884197; const long double eps=1e-15; template <class T,class U>void mineq(T& a,U b){if(a>b){a=b;}} template <class T,class U>void maxeq(T& a,U b){if(a<b){a=b;}} llint gcd(llint a,llint b){if(a%b==0){return b;}else return gcd(b,a%b);} llint lcm(llint a,llint b){return a/gcd(a,b)*b;} template<class T> void SO(T& ve){sort(ve.begin(),ve.end());} template<class T> void REV(T& ve){reverse(ve.begin(),ve.end());} int LBI(vector<int>&ar,llint in){return lower_bound(ar.begin(),ar.end(),in)-ar.begin();} int UBI(vector<int>&ar,llint in){return upper_bound(ar.begin(),ar.end(),in)-ar.begin();} vector<vector<pair<int,llint>>>go;//行先,長さ tuple<llint,llint,llint>solve(int ter,int per){ //if(go[ter].size()==1){return mp(0,go[ter][0].sec);}//葉 llint ml=-big,fans=0; pair<llint,int>han=mp(-big,-1),hbn=mp(-big,-1),fsa=mp(-big,-1),fsb=mp(-big,-1); //ml my long 自分の親への長さ //hans 本線-副線の最大 //hsa,hsb 自分の子の長さ上位二つ //fans 副線だとしたときのスコア //fsa その子をとるときの最大の良さ for(auto it:go[ter]){ if(it.fir==per){ml=it.sec;continue;} auto ret=solve(it.fir,ter); fans+=get<0>(ret); maxeq(hbn,mp(get<1>(ret)+it.sec,it.fir)); if(han<hbn){swap(han,hbn);} maxeq(fsb,mp(get<2>(ret),it.fir)); if(fsa<fsb){swap(fsa,fsb);} } //現在のスコア,上を使うことによるマイナスプラス値 llint fhos=max(0LL,ml+fsa.fir); llint hbot=0;//異なる二つでの、hans+fsa if(han.sec==fsa.sec){hbot=max(han.fir+fsb.fir,hbn.fir+fsa.fir);} else{hbot=han.fir+fsa.fir;} maxeq(hbot,fsa.fir+fsb.fir); maxeq(hbot,0); //cerr<<"ter="<<ter<<"ret="<<fans+fhos<<" "<<hbot-fhos<<" "<<ml-fhos<<endl; return mt(fans+fhos,hbot-fhos,ml-fhos); } int main(void){ int n;cin>>n;go.res(n);n--; while(n--){ int a,b;llint c; cin>>a>>b>>c;a--;b--; go[a].pub(mp(b,c)); go[b].pub(mp(a,c)); } go[0].pub(mp(-1,-big)); auto rets=solve(0,-1); cout<<get<0>(rets)+get<1>(rets)<<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...