제출 #199448

#제출 시각아이디문제언어결과실행 시간메모리
199448TadijaSebezBall Machine (BOI13_ballmachine)C++11
98.08 / 100
516 ms24928 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int N=100050;
vector<int> E[N];
int sz[N],mn[N],hc[N];
void DFS(int u){
	sz[u]=1;mn[u]=u;
	for(int v:E[u])
		DFS(v),
		sz[u]+=sz[v],
		mn[u]=min(mn[u],mn[v]),
		hc[u]=sz[v]>sz[hc[u]]?v:hc[u];
}
int idx[N],isz;
void IDF(int u){
	sort(E[u].begin(),E[u].end(),[&](int i,int j){return mn[i]<mn[j];});
	for(int v:E[u])IDF(v);
	idx[u]=++isz;
}
int lid[N],rid[N],nod[N],dep[N],tid,head[N];
void HLD(int u){
	if(!head[u])head[u]=u;
	for(int i=0;i<E[u].size();i++)if(E[u][i]==hc[u])swap(E[u][i],E[u][0]);
	lid[u]=++tid;
	nod[tid]=u;
	if(hc[u])head[hc[u]]=head[u];
	for(int v:E[u])dep[v]=dep[u]+1,HLD(v);
	rid[u]=tid;
}
const int M=2*N;
int ls[M],rs[M],tsz,root,sum[M];
void Set(int &c,int ss,int se,int qi,int f){
	if(!c)c=++tsz;
	if(ss==se){sum[c]=f;return;}
	int mid=ss+se>>1;
	if(qi<=mid)Set(ls[c],ss,mid,qi,f);
	else Set(rs[c],mid+1,se,qi,f);
	sum[c]=sum[ls[c]]+sum[rs[c]];
}
int Search(int c,int ss,int se,int k){
	if(ss==se)return sum[c]==k?ss:ss-1;
	int mid=ss+se>>1;
	if(sum[rs[c]]>=k)return Search(rs[c],mid+1,se,k);
	else return Search(ls[c],ss,mid,k-sum[rs[c]]);
}
int Get(int c,int ss,int se,int qs,int qe){
	if(qs>qe || qs>se || ss>qe)return 0;
	if(qs<=ss && qe>=se)return sum[c];
	int mid=ss+se>>1;
	return Get(ls[c],ss,mid,qs,qe)+Get(rs[c],mid+1,se,qs,qe);
}
int Search(int ss,int se){return Search(root,1,N,Get(root,1,N,ss,N));}
int par[N];
int main(){
	int n,q;
	scanf("%i %i",&n,&q);
	for(int i=1;i<=n;i++)scanf("%i",&par[i]),E[par[i]].pb(i);
	int rt=E[0][0];
	DFS(rt);
	IDF(rt);
	HLD(rt);
	set<pair<int,int>> avb;
	for(int i=1;i<=n;i++)avb.insert({idx[i],i});
	while(q--){
		int t,k;
		scanf("%i %i",&t,&k);
		if(t==1){
			int las=-1;
			while(k--){
				auto p=*avb.begin();
				avb.erase(p);
				Set(root,1,N,lid[p.second],1);
				las=p.second;
			}
			printf("%i\n",las);
		}else{
			int u=k,las=k,ans;
			while(u){
				int v=Search(lid[head[u]],lid[u]);
				//printf("%i %i %i %i\n",head[u],u,nod[v],v);
				if(v>lid[u]){ans=las;break;}
				else if(v==lid[head[u]]){
					las=head[u];
					u=par[head[u]];
				}else{ans=nod[v];break;}
			}
			if(u==0)ans=las;
			//int ans=k;
			//printf("ans: %i\n",ans);
			printf("%i\n",dep[k]-dep[ans]);
			avb.insert({idx[ans],ans});
			Set(root,1,N,lid[ans],0);
		}
	}
	return 0;
}

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

ballmachine.cpp: In function 'void HLD(int)':
ballmachine.cpp:24:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<E[u].size();i++)if(E[u][i]==hc[u])swap(E[u][i],E[u][0]);
              ~^~~~~~~~~~~~
ballmachine.cpp: In function 'void Set(int&, int, int, int, int)':
ballmachine.cpp:36:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid=ss+se>>1;
          ~~^~~
ballmachine.cpp: In function 'int Search(int, int, int, int)':
ballmachine.cpp:43:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid=ss+se>>1;
          ~~^~~
ballmachine.cpp: In function 'int Get(int, int, int, int, int)':
ballmachine.cpp:50:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid=ss+se>>1;
          ~~^~~
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:57:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i %i",&n,&q);
  ~~~~~^~~~~~~~~~~~~~~
ballmachine.cpp:58:42: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1;i<=n;i++)scanf("%i",&par[i]),E[par[i]].pb(i);
                       ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
ballmachine.cpp:67:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%i %i",&t,&k);
   ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...