제출 #102339

#제출 시각아이디문제언어결과실행 시간메모리
102339janlivensBall Machine (BOI13_ballmachine)C++14
15.23 / 100
1087 ms12400 KiB
// This  Program is made by Jan(Codezebra)
#include<bits/stdc++.h>
//#define int long long
//#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;

int n,q,root;
int grens=0;
vector<bool> vol;
vector<int>parent;
vector<vector<pair<int,int> > >children;
vector<int> place;
vector<int> topo;
priority_queue<int, vector<int>, greater<int> > gaten;

int find(int x){
	for(int i=0;i<children[parent[x]].size();i++){
		if(children[parent[x]][i].second==x){
			return i;
		}
	}
	return -1;
}


int build(int x){
//	cout<<"in "<<x<<"\n";
	if(children[x].empty()){
		place[x]=topo.size();
		topo.push_back(x);
	//	cout<<x<<"out\n";
		return children[parent[x]][find(x)].first=x;
	}
	int a=x;
	for(auto e:children[x]){
		a=min(a,build(e.second));
	}
//	cout<<a<< "\n";
	place[x]=topo.size();
	topo.push_back(x);
//	cout<<x<<"out\n";
	return children[parent[x]][find(x)].first=a;
}

int roll(int x){
	
	//cout<<x<<"*";
	
	for(int i=01;i<children[x].size();i++){
		if(!vol[children[x][i].second]){
		//	vol[children[x][i].second]=1;
			return roll(children[x][i].second);
		}
	}
	vol[x]=1;
	return x;
	
}

int op1(int k){
	
	if(k>gaten.size()){
	//	cout<<"wipe them all!\n";
		while(!gaten.empty()){
			vol[topo[gaten.top()]]=0;
			gaten.pop();
		}
	//	cout<<"done that, been there\n";
	//	cout<<"couting: ";
		for(int i=grens;i<k+grens;i++){
	//		cout<<i<<" ";
			vol[topo[i]]=1;
		}
//		cout<<"go!\n";
		
		grens+=k;
		return topo[grens-1];
	}
	else{
	//	cout<<"just snipe some!\n";
		for(int i=0;i<k;i++){
			vol[topo[gaten.top()]]=1;
			if(i==k-1){
				int pp=gaten.top();
				gaten.pop();
				return topo[pp];
			}
			gaten.pop();
		}
	}
	/*
	for(int i=1;i<k;i++){
	//	cout<<roll(root)<<" ";
		int qq=roll(root);
	}
	return roll(root);
	*/
}

int op2(int x){
	int a=x;
	int prev=x;
	for(int i=0;;i++){
		if(!vol[parent[a]]){
			vol[a]=0;
			gaten.push(place[a]);
			return i;
		}
		a=parent[a];
	}
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	cin>>n>>q;
	
	children.resize(n+1);
	parent.resize(n+1,0);
	vol.resize(n+1,0);
	place.resize(n+1,0);
	
	for(int i=1;i<=n;i++){
		int p;
		cin>>p;
		
		parent[i]=p;
		children[p].push_back({0,i});
	}
	root=children[0][0].second;
	
	build(root);

	topo.clear();
	for(int i=0;i<n;i++){
		sort(children[i].begin(),children[i].end());
	}
	build(root);
/*	for(int e:topo){
		cout<<e<<" ";
		
	}cout<<"\n";*/
	int ans[n];
	for(int i=0;i<q;i++){
		int type;
		cin>>type;
		if(type==1){
			int k;
			cin>>k;
			cout<<op1(k)<<"\n";
		}
		else{
			int x;
			cin>>x;
			cout<<op2(x)<<"\n";
		}
	}
	return 0;
}

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

ballmachine.cpp: In function 'int find(int)':
ballmachine.cpp:17:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<children[parent[x]].size();i++){
              ~^~~~~~~~~~~~~~~~~~~~~~~~~~~
ballmachine.cpp: In function 'int roll(int)':
ballmachine.cpp:49:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=01;i<children[x].size();i++){
               ~^~~~~~~~~~~~~~~~~~~
ballmachine.cpp: In function 'int op1(int)':
ballmachine.cpp:62:6: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(k>gaten.size()){
     ~^~~~~~~~~~~~~
ballmachine.cpp: In function 'int op2(int)':
ballmachine.cpp:102:6: warning: unused variable 'prev' [-Wunused-variable]
  int prev=x;
      ^~~~
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:144:6: warning: unused variable 'ans' [-Wunused-variable]
  int ans[n];
      ^~~
ballmachine.cpp: In function 'int op1(int)':
ballmachine.cpp:98:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...