제출 #866426

#제출 시각아이디문제언어결과실행 시간메모리
866426yeediotCat Exercise (JOI23_ho_t4)C++14
100 / 100
325 ms70852 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define F first #define S second #define all(x) x.begin(),x.end() #define pii pair<int,int> #define pb push_back #define sz(x) (int)(x.size()) #define chmin(x,y) x=min(x,y) #define chmax(x,y) x=max(x,y) #define vi vector<int> #define vp vector<pii> #define vvi vector<vi> //Don't open the standings during contests. void setIO(string s) { freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout); } const int mxn=2e5+5; vector<int>adj[mxn]; int h[mxn],root,cnt[mxn],dep[mxn],to[mxn],dp[mxn]; int jump[20][mxn]; vector<pii>ord; int cur=0; void cntsz(int v,int pa){ cnt[v]=1; dep[v]=dep[pa]+1; jump[0][v]=pa; for(auto u:adj[v]){ if(u==pa)continue; cntsz(u,v); cnt[v]+=cnt[u]; } } void build(int n){ for(int i=1;i<20;i++){ for(int j=1;j<=n;j++){ jump[i][j]=jump[i-1][jump[i-1][j]]; } } } int lca(int v,int u){ if(dep[v]<dep[u])swap(v,u); int dif=dep[v]-dep[u]; for(int i=0;i<20;i++){ if(dif>>i&1){ v=jump[i][v]; } } if(u==v)return v; for(int i=19;i>=0;i--){ if(jump[i][u]!=jump[i][v]){ v=jump[i][v]; u=jump[i][u]; } } return jump[0][v]; } int find(int x){ return x==to[x]?x:to[x]=find(to[x]); } int dist(int a,int b){ return dep[a]+dep[b]-2*dep[lca(a,b)]; } void merge(int a,int b){ a=find(a),b=find(b); chmax(dp[b],dp[a]+dist(a,b)); to[a]=b; } signed main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); int n; cin>>n; for(int i=1;i<=n;i++){ to[i]=i; cin>>h[i]; ord.pb({h[i],i}); if(h[i]==n)root=i; } sort(all(ord)); for(int i=1;i<n;i++){ int a,b; cin>>a>>b; adj[a].pb(b); adj[b].pb(a); } cntsz(root,root); build(n); int ans=0; for(auto [he,x]:ord){ for(auto u:adj[x]){ if(h[u]<he){ merge(u,x); } } chmax(ans,dp[x]); } cout<<ans<<'\n'; } /* input: 1 0 1 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 0 0 1 1 1 1 1 0 0 1 1 0 1 0 0 1 1 */

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int main()':
Main.cpp:92:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   92 |     for(auto [he,x]:ord){
      |              ^
Main.cpp: In function 'void setIO(std::string)':
Main.cpp:17:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |     freopen((s + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:18:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |     freopen((s + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...