이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef int64_t llo;
#define mp make_pair
#define pb push_back
#define a first
#define b second
//#define endl '\n'
int n,d;
int ans=0;
set<int> adj[200001];
int vis[200001];
vector<pair<int,int>> cur;
int par[200001];
void dfs(int no,int par2=-1,int levv=0){
cur.pb({levv,no});
for(auto j:adj[no]){
if(j==par2){
continue;
}
dfs(j,no,levv+1);
}
}
int ss[200001];
void dfs2(int no,int par2=-1,int levv=0){
ss[no]=1;
for(auto j:adj[no]){
if(j==par2){
continue;
}
dfs2(j,no,levv+1);
ss[no]+=ss[j];
}
}
int lo=0;
int find(int no,int par2=-1){
for(auto j:adj[no]){
if(j==par2){
continue;
}
if(ss[j]>lo/2){
return find(j,no);
}
}
return no;
}
/*vector<int> mm;
void dfs2(int no,int par=-1,int levv=0){
vis[no]=1;
mm.pb(no);
// if(levv<d){
for(auto j:adj[no]){
if(j.b==par){
continue;
}
if(j.a+levv>=d){
break;
}
dfs2(j.b,no,levv+j.a);
}
// }
}*/
int cot;
int cot2;
vector<pair<int,int>> dist[200001];
int dist2[200001][20];
int lev[200001];
int ind[200001];
void calc(int no,int par2=-1,int levv=0){
dist2[no][cot2]=levv;
dist[cot].pb({levv,no});
for(auto j:adj[no]){
if(j==par2){
continue;
}
calc(j,no,levv+1);
}
}
void dec(int no,int par2=-1,int levv=0){
if(levv>=20){
while(true){
continue;
}
}
dfs2(no);
lo=ss[no];
int cen=find(no);
//cout<<cen<<","<<levv<<endl;
cot=cen;
cot2=levv;
lev[cen]=levv;
par[cen]=par2;
calc(cen);
sort(dist[cen].begin(),dist[cen].end());
ind[cen]=0;
for(auto j:adj[cen]){
adj[j].erase(cen);
}
for(auto j:adj[cen]){
dec(j,cen,levv+1);
}
adj[cen].clear();
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>d;
for(int i=1;i<n;i++){
int aa;
cin>>aa;
adj[aa].insert(i);
adj[i].insert(aa);
}
dfs(0);
sort(cur.begin(),cur.end());
reverse(cur.begin(),cur.end());
dec(0);
for(auto no:cur){
if(vis[no.b]){
continue;
}
int nn=no.b;
while(nn!=-1){
int x=dist2[no.b][lev[nn]];
while(ind[nn]<dist[nn].size()){
if(dist[nn][ind[nn]].a+x<d){
vis[dist[nn][ind[nn]].b]=1;
ind[nn]+=1;
}
else{
break;
}
}
nn=par[nn];
}
ans+=1;
/*ans+=1;
dfs2(no.b);
for(auto j:mm){
for(auto ll:adj[j]){
if(ll==)
if(adj[ll].find(j)!=adj[ll].end()){
adj[ll].erase(j);
}
}
}
mm.clear();*/
}
cout<<ans<<endl;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
catinatree.cpp: In function 'int main()':
catinatree.cpp:137:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(ind[nn]<dist[nn].size()){
~~~~~~~^~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |