제출 #897644

#제출 시각아이디문제언어결과실행 시간메모리
897644Malix꿈 (IOI13_dreaming)C++14
0 / 100
58 ms16848 KiB
#include "dreaming.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; typedef pair<int,int> pi; #define REP(i,a,b) for(int i=a;i<b;i++) #define F first #define S second #define PB push_back #define MP make_pair vi leaf,leafVal; int findLeaf(int a,vector<vector<pi>> &c,vi &p,vi &toLeaf,int &i,vi &up){ if(toLeaf[a]!=-1)return toLeaf[a]; up[a]=i; if(c[a].size()==0){ toLeaf[a]=0; return 0; } if(c[a].size()<2&&p[a]!=a){ toLeaf[a]=0; return 0; } for(auto u:c[a]){ if(u.F==p[a])continue; p[u.F]=a; toLeaf[a]=max(toLeaf[a],findLeaf(u.F,c,p,toLeaf,i,up)+u.S); if(toLeaf[a]==toLeaf[u.F]+u.S){ leaf[a]=u.F; leafVal[a]=u.S; } } return toLeaf[a]; } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { vi p(N,-1); vi toLeaf(N,-1); vi maxLength(N,0); vi up(N); vi parents; leaf.resize(N,-1); leafVal.resize(N,-1); vector<vector<pi>> c(N); REP(i,0,M){ c[A[i]].PB({B[i],T[i]}); c[B[i]].PB({A[i],T[i]}); } REP(i,0,N){ if(toLeaf[i]!=-1)continue; p[i]=i;parents.PB(i);up[i]=i; findLeaf(i,c,p,toLeaf,i,up); } // cout<<"lol"; REP(i,0,N){ // cout<<i<<" "<<c[i].size()<<" "; if(c[i].size()==0){ maxLength[i]=0; continue; } if(c[i].size()==1){ maxLength[i]=toLeaf[i]; continue; } if(c[i].size()<3&&p[i]!=i)continue; priority_queue<int> pq; for(auto u:c[i]){ if(p[i]==u.F)continue; // if(toLeaf[u]==-1)pq.push(grid[i][u]); else pq.push(toLeaf[u.F]+u.S); } maxLength[i]+=pq.top(); pq.pop();; maxLength[i]+=pq.top(); } map<int,pi> m; REP(i,0,N){ if(m.count(up[i])){ if(m[up[i]].F<maxLength[i]){ m[up[i]]=make_pair(maxLength[i],i); } } else{ m[up[i]]=make_pair(maxLength[i],i); } } priority_queue<tuple<int,int,int>> pq2; priority_queue<int> maxVals; for(auto z:parents){ int u=m[z].S;int u2=u; vi tempVal1,tempVal2; if(c[u].size()==0){ maxVals.push(0); } else if(c[u].size()==1){ while(leaf[u]!=-1){ tempVal1.PB(leafVal[u]); u=leaf[u]; } // cout<<"lol\n"; int sum=0;int pos=0; while(sum<maxLength[u2]/2){ sum+=tempVal1[pos]; pos++; } int sum2=0;pos=0; while(sum<maxLength[u2]/2){ sum2+=tempVal1[pos]; pos++; } sum=min(max(sum,maxLength[u2]-sum),max(sum2,maxLength[u2]-sum2)); maxVals.push(sum); } else{ for(auto g:c[u]){ if(g.F==p[u])continue; pq2.push({toLeaf[g.F]+g.S,g.F,g.S}); } int x1=get<1>(pq2.top()); int xx1=get<2>(pq2.top()); pq2.pop(); int x2=get<1>(pq2.top()); int xx2=get<2>(pq2.top()); tempVal1.PB(xx1); tempVal2.PB(xx2); while(leaf[x1]!=-1){ tempVal1.PB(leafVal[x1]); x1=leaf[x1]; } while(leaf[x2]!=-1){ tempVal1.PB(leafVal[x2]); x2=leaf[x2]; } reverse(tempVal1.begin(),tempVal1.end()); for(auto y:tempVal2)tempVal1.PB(y); int sum=0;int pos=0; while(sum<maxLength[u2]/2){ sum+=tempVal1[pos]; pos++; } reverse(tempVal1.begin(),tempVal1.end()); int sum2=0;pos=0; while(sum<maxLength[u2]/2){ sum2+=tempVal1[pos]; pos++; } sum=min(max(sum,maxLength[u2]-sum),max(sum2,maxLength[u2]-sum2)); maxVals.push(sum); } } //REP(i,0,N)cout<<toLeaf[i]<<" "; //cout<<"\n"; //REP(i,0,N)cout<<maxLength[i]<<" "; //cout<<"\n"; //for(auto g1:maxVals)cout<<g1<<" "; // cout<<"\n"; int r1=maxVals.top(); maxVals.pop(); int r2=maxVals.top(); maxVals.pop(); int r3=maxVals.top(); int ans=r1+r2+L; // cout<<r1<<" "<<r2<<" "<<r3<<"\n"; ans=max(ans,r2+r3+2*L); for(auto z:parents){ int k1=m[z].F; ans=max(ans,k1); } return ans; return 42; }
#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...