Submission #1236498

#TimeUsernameProblemLanguageResultExecution timeMemory
1236498vivkostovMeetings (JOI19_meetings)C++20
0 / 100
2 ms516 KiB
//#pragma once //#include "grader.cpp" #include "meetings.h" #include <bits/stdc++.h> using namespace std; int n,br,root,cen,used[2005],dp[2005],ind1,ind2,added[2005]; vector<int>v[2005]; void push_between(int a,int b,int st) { v[st].push_back(a); v[st].push_back(b); for(int i=0;i<v[a].size();i++) { if(v[a][i]==b) { v[a][i]=st; break; } } for(int i=0;i<v[b].size();i++) { if(v[b][i]==a) { v[b][i]=st; break; } } } void make_dp(int beg) { int w; dp[beg]=1; used[beg]=5; for(int i=0;i<v[beg].size();i++) { w=v[beg][i]; if(!used[w]) { make_dp(w); dp[beg]+=dp[w]; } } } void find_centroid(int beg,int par,int num) { int w; for(int i=0;i<v[beg].size();i++) { w=v[beg][i]; if(used[w]==1||w==par)continue; if(dp[w]>=(num+1)/2) { find_centroid(w,beg,num); return; } } cen=beg; } void clea(int beg,int par) { int w; dp[beg]=0; used[beg]=0; for(int i=0;i<v[beg].size();i++) { w=v[beg][i]; if(used[w]!=5||w==par)continue; clea(w,beg); } } void make_sz() { clea(root,0); used[cen]=5; int ma1=0,ma2=0,w; ind1=-1; ind2=-1; for(int i=0;i<v[cen].size();i++) { w=v[cen][i]; if(used[w]==1)continue; make_dp(w); if(ma1<dp[w]) { ma2=ma1; ind2=ind1; ma1=dp[w]; ind1=w; } else if(ma2<dp[w]) { ma2=dp[w]; ind2=w; } } used[cen]=0; } void mix(int ind,int st) { int q=Query(min(cen,ind),max(cen,ind),st); if(q==ind) { v[ind].push_back(st); v[st].push_back(ind); br++; } else if(q==cen) { v[cen].push_back(st); v[st].push_back(cen); br++; } else if(q==st) { push_between(ind,cen,st); br++; } else { push_between(ind,cen,q); added[q]=1; v[q].push_back(st); v[st].push_back(q); br+=2; } } void add(int st) { //if(st>5)return; root=0; cen=0; memset(dp,0,sizeof(dp)); memset(used,0,sizeof(used)); int num=0,flag=0; /*cout<<st<<endl; for(int i=0;i<n;i++) { cout<<i<<" : "; for(int j=0;j<v[i].size();j++) { cout<<v[i][j]<<" "; } cout<<endl; }*/ while(true) { make_dp(root); num=dp[root]; find_centroid(root,root,num); make_sz(); //cout<<ind1<<" "<<ind2<<" "<<cen<<" "<<num<<" "<<root<<endl; if(ind1==-1) { v[cen].push_back(st); v[st].push_back(cen); br++; break; } if(ind2==-1) { mix(ind1,st); break; } if(num==3) { int q=Query(min(cen,ind2),max(cen,ind2),st); if(q==ind2) { v[ind2].push_back(st); v[st].push_back(ind2); br++; break; } if(q==st) { push_between(ind2,cen,st); br++; break; } if(q!=cen) { push_between(ind2,cen,q); v[q].push_back(st); v[st].push_back(q); added[q]=1; br+=2; break; } mix(ind1,st); break; } int q=Query(ind1,ind2,st); clea(cen,cen); root=q; if(q==cen) { used[ind1]=1; used[ind2]=1; } else { used[cen]=1; } /*cout<<cen<<" "<<ind1<<" "<<ind2<<endl; for(int i=0;i<n;i++) { cout<<used[i]<<" "; } cout<<endl;*/ flag++; if(flag==20)break; } } void Solve(int N) { n=N; br=1; for(int i=1;i<n;i++) { if(!added[i])add(i); } for(int i=0;i<n;i++) { //cout<<i<<" : "; for(int j=0;j<v[i].size();j++) { //cout<<v[i][j]<<" "; if(v[i][j]>i)Bridge(i,v[i][j]); } //cout<<endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...