Submission #59564

#TimeUsernameProblemLanguageResultExecution timeMemory
59564KLPPJousting tournament (IOI12_tournament)C++14
0 / 100
210 ms75072 KiB
#include<iostream>
#include<vector>
using namespace std;
vector<int> nei[3000000];
int n,c,r;
int arr [3000000];
int ansL[3000000];
int ansR[3000000];
int maxchain[3000000];
int index[3000000];
class FT{
	private:vector<int> ft;
	public: FT(int n){ft.assign(n+1,0);}
		int rsq(int b){
			int ans=0;
			for(;b;b-=(b&(-b)))ans+=ft[b];
			return ans;
		}
		void update(int k, int v){
			for(;k<(int)ft.size();k+=(k&(-k)))ft[k]+=v;
		}
	
};
int DPl(int node){
	if(node==n-1){
		ansL[node]=0;
		return 0;
	}
	if(node<n-1){
		ansL[node]=arr[node];
		return arr[node];
	}
	ansL[node]=n;
	for(int i=0;i<(int)nei[node].size();i++){
		int v=nei[node][i];
		ansL[node]=min(ansL[node],DPl(v));
	}
	return ansL[node];
}
int DPr(int node){
	if(node==0){
		ansR[node]=0;
		return 0;
	}
	if(node<n){
		ansR[node]=arr[node-1];
		return arr[node-1];
	}
	ansR[node]=n;
	for(int i=0;i<(int)nei[node].size();i++){
		int v=nei[node][i];
		ansR[node]=min(ansR[node],DPr(v));
	}
	return ansR[node];
}
int ChainDP(int node){
	if(maxchain[node]!=-1){
		return maxchain[node];
	}
	if(node<n){
		index[node]=-1;
		maxchain[node]=0;
		return 0;
	}
	int ans=0;
	int DPright[nei[node].size()];
	int DPleft[nei[node].size()];
	DPleft[0]=n+1;
	for(int i=0;i<(int)nei[node].size()-1;i++){
		int v=nei[node][i];
		DPleft[i+1]=min(DPleft[i],DPl(v));
	}
	DPright[nei[node].size()-1]=n+1;
	for(int i=nei[node].size()-1;i>0;i--){
		int v=nei[node][i];
		DPright[i-1]=min(DPright[i],DPr(v));
	}
	index[node]=-1;
	for(int i=0;i<(int)nei[node].size();i++){
		if(min(r,DPleft[i])==r && min(r,DPright[i])==r && ans<1+ChainDP(nei[node][i])){
			ans=max(ans,1+ChainDP(nei[node][i]));
			index[node]=nei[node][i];
		}
	}
	if(ans==0)ans=-1;
	maxchain[node]=ans;
	return ans;
}
int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) {
	n=N;
	c=C;
	r=R;
	r=n-r;
	for(int i=0;i<n-1;i++){
		arr[i]=K[i];
		arr[i]=n-arr[i];
	}
	int counter=n;
	int pointer[n];
	int next[n];
	for(int i=0;i<n;i++){
		pointer[i]=i;
		next[i]=i+1;
	}
	FT a(n);
	for(int i=0;i<c;i++){
		int x,y;
		x=S[i];
		y=E[i];
		int hi,lo;
		lo=-1;
		hi=n;
		while(hi-lo>1){
			int mid=(hi+lo)/2;
			if(a.rsq(mid+1)+mid<x)lo=mid;
			else hi=mid;
		}
		int start=hi;
		nei[counter].push_back(pointer[hi]);
		while(y>x){
			hi=next[hi];
			a.update(hi+1,-1);
			y--;
			nei[counter].push_back(pointer[hi]);
		}
		hi=next[hi];
		next[start]=hi;
		pointer[start]=counter;
		
		counter++;
		
	}
	
	DPl(n+c-1);
	
	DPr(n+c-1);
	
	for(int i=0;i<n+c;i++)maxchain[i]=-1;
	for(int i=0;i<n+c;i++)ChainDP(i);
	int maximo=0;
	for(int i=0;i<n+c;i++){
		if(maxchain[maximo]<maxchain[i])maximo=i;
	}
	while(index[maximo]!=-1){
		maximo=index[maximo];
	}
	return maximo;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...