Submission #697748

#TimeUsernameProblemLanguageResultExecution timeMemory
697748vjudge1Torrent (COI16_torrent)C++17
100 / 100
196 ms16236 KiB
#include<bits/stdc++.h> using namespace std; template <typename T> inline void read(T &x) { x=0;T f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-')f=-1; for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48); x*=f; } template <typename T,typename ...Args>void read(T &x,Args&...args){read(x),read(args...);} template <typename T> void print(T x) { if(x<0) x=-x,putchar('-'); if(x>9) print(x/10); putchar(x%10+48); } template <typename T> void print(T x,char c){print(x); putchar(c);} template<typename T>inline void output(T x){print(x,' ');} template<typename T,typename ...Arg>inline void output(T x,Arg ...arg){output(x);output(arg...);} const int N=300007,inf=0x3f3f3f3f; int n,rt[2],cnt,h[N],dp[N],pa[N],poss; vector<int>tmp,pos; struct edge{int to,nxt;}mp[N<<1]; void add(int x,int y) { cnt++; mp[cnt].nxt=h[x]; mp[cnt].to=y; h[x]=cnt; } void prework(int x,int fa) { pa[x]=fa; for(int i=h[x];i;i=mp[i].nxt) { int y=mp[i].to; if(y==fa) continue; prework(y,x); } tmp.clear(); for(int i=h[x];i;i=mp[i].nxt) if(mp[i].to!=fa) tmp.push_back(dp[mp[i].to]); sort(tmp.begin(),tmp.end()); reverse(tmp.begin(),tmp.end()); for(int i=1;i<=tmp.size();i++) dp[x]=max(dp[x],tmp[i-1]+i); } void init() { int now=rt[1]; while(now!=rt[0]) pos.push_back(now),now=pa[now]; } int sol(int x) { if(x==poss) return -inf; vector<int>vvv; int xxx=0; for(int i=h[x];i;i=mp[i].nxt) if(mp[i].to!=pa[x]) vvv.push_back(sol(mp[i].to)); sort(vvv.begin(),vvv.end()); reverse(vvv.begin(),vvv.end()); for(int i=1;i<=vvv.size();i++) xxx=max(xxx,vvv[i-1]+i); return xxx; } bool check(int x) { poss=-1; int tim=x; for(int i=0;i<pos.size();i++) { tmp.clear(); int ok=1; for(int j=h[pos[i]];j;j=mp[j].nxt) if(mp[j].to!=pa[pos[i]]&&(i==0||mp[j].to!=pos[i-1])) tmp.push_back(dp[mp[j].to]); sort(tmp.begin(),tmp.end()); reverse(tmp.begin(),tmp.end()); for(int j=0;j<tmp.size();j++) { tmp[j]+=j+1; if(tmp[j]>tim) ok=0; } if(!ok) break; ok=tmp.size(); for(int j=tmp.size()-1;j>=0;j--) { if(tmp[j]==tim) break; ok=j; } tim--; tim-=ok; poss=pos[i]; } if(poss==-1) return false; return sol(rt[0])<=x; } int main() { read(n,rt[0],rt[1]); for(int i=1,x,y;i<n;i++) read(x,y),add(x,y),add(y,x); prework(rt[0],0); init(); int ml=0,mr=n,ans; while(ml<=mr) { int mid=(ml+mr)>>1; if(check(mid)) ans=mid,mr=mid-1; else ml=mid+1; } print(ans,'\n'); return 0; }

Compilation message (stderr)

torrent.cpp: In function 'void prework(int, int)':
torrent.cpp:45:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |  for(int i=1;i<=tmp.size();i++)
      |              ~^~~~~~~~~~~~
torrent.cpp: In function 'int sol(int)':
torrent.cpp:63:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |  for(int i=1;i<=vvv.size();i++)
      |              ~^~~~~~~~~~~~
torrent.cpp: In function 'bool check(int)':
torrent.cpp:70:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |  for(int i=0;i<pos.size();i++)
      |              ~^~~~~~~~~~~
torrent.cpp:78:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |   for(int j=0;j<tmp.size();j++)
      |               ~^~~~~~~~~~~
torrent.cpp: In function 'int main()':
torrent.cpp:17:51: warning: 'ans' may be used uninitialized in this function [-Wmaybe-uninitialized]
   17 | template <typename T> void print(T x,char c){print(x); putchar(c);}
      |                                              ~~~~~^~~
torrent.cpp:101:16: note: 'ans' was declared here
  101 |  int ml=0,mr=n,ans;
      |                ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...