Submission #395008

# Submission time Handle Problem Language Result Execution time Memory
395008 2021-04-27T15:33:34 Z Hazem Jousting tournament (IOI12_tournament) C++14
100 / 100
239 ms 63608 KB
#include <bits/stdc++.h>
//#include "grader.h"
using namespace std;
 
#define LL long long
#define F first
#define S second
 
const int N = 1e6+10;
const LL INF = 1e9;
 
int a[N],l2[N],r2[N];
int par[N],sizes[N],nxt[N],vals[N],pr[N][30];
LL tree[N],lazy[N];
vector<int>adj[N];
pair<int,int>p[N];
 
void push(int v,int l,int r){
	
	tree[v] += lazy[v];
	
	if(l!=r){
		lazy[v*2] += lazy[v];
		lazy[v*2+1] += lazy[v];
	}
	lazy[v] = 0;
}
 
void update(int v,int tl,int tr,int l,int r,int val){
	
	push(v,tl,tr);
	
	if(tl>r||tr<l)
		return ;
		
	if(tl>=l&&tr<=r){
		lazy[v] += val;
		push(v,tl,tr);
		return ;
	}
		
	int mid = (tl+tr)/2;
	update(v*2,tl,mid,l,r,val);
	update(v*2+1,mid+1,tr,l,r,val);
	tree[v] = tree[v*2]+tree[v*2+1];
}
 
int get(int v,int tl,int tr,int val){
	
	push(v,tl,tr);
	
	if(tl==tr)
		return tl;
		
	int mid = (tl+tr)/2;
	
	push(v*2,tl,mid);
	push(v*2+1,mid+1,tr);
	
	if(tree[v*2]>=val)
		return get(v*2,tl,mid,val);
	else 
		return get(v*2+1,mid+1,tr,val-tree[v*2]);
}
 
int find_set(int u){
	
	if(par[u]==u)
		return u;
	return par[u] = find_set(par[u]);
}
 
void merge(int u,int v){
	
	u = find_set(u);
	v = find_set(v);
	
	if(u==v)
		return ;
		
	if(sizes[u]<sizes[v])
		swap(u,v);
		
	par[v] = u;
	sizes[u] += sizes[v];
	nxt[u] = max(nxt[u],nxt[v]);
}
 
void make_val(int u,int val1){
	
	u = find_set(u);
	vals[u] = val1;
}
 
void dfs(int i,int pre){
	
	pr[i][0] = pre;
	
	for(int j=1;j<=20;j++)
		pr[i][j] = pr[pr[i][j-1]][j-1];
		
	for(auto x:adj[i])
		if(x==pre)continue;
		else dfs(x,i);
}
 
int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) {	
	
	
	int n = N,n1 = N;
	
	for(int i=1;i<n;i++)
		a[i] = K[i-1];
	
	a[n] = R;
	a[0] = a[n+1] = INF;
	
	for(int i=1;i<=n;i++){
		par[i] = vals[i] = i;
		sizes[i] = 1;
		nxt[i] = i+1,p[i] = {i,i};
		update(1,1,n,i,i,1);
	}
		
	for(int i=0;i<C;i++){
		
		int l1 = S[i]+1,r1 = E[i]+1;
		int cnt = l1,pos = get(1,1,n,l1);
		
		vector<int>vec;
		while(cnt<=r1){
			vec.push_back(pos);
			pos = nxt[find_set(pos)];
			cnt++;
		}
		
		n1++;
		for(int i=0;i<vec.size();i++)
			adj[n1].push_back(vals[find_set(vec[i])]);
		
		for(int i=0;i<vec.size()-1;i++)
				merge(vec[i],vec[i+1]);
		
		p[n1] = {vec[0],nxt[find_set(vec.back())]-1};
		for(int i=vec.size()-1;i>=1;i--)
			update(1,1,n,vec[i],vec[i],-1);
 
		make_val(vec[0],n1);
	}
	
	stack<int>st;
	st.push(0);	
	for(int i=1;i<=n;i++){
		
		while(a[st.top()]<R)st.pop();
		l2[i] = st.top();
		while(a[st.top()]<a[i])st.pop();
		st.push(i);
	}
	
	while(!st.empty())st.pop();
	st.push(n+1);
	
	for(int i=n;i>=1;i--){
		
		while(a[st.top()]<R)st.pop();
		
		if(a[i]>R)r2[i] = i;
		else r2[i] = st.top();
		
		while(a[st.top()]<a[i])st.pop();
		if(i<n)
			st.push(i);
	}
	
	dfs(n1,n1);
	
	int ret = n-1,ans = 0;
	for(int i=n;i>=1;i--){
		
		int ans1 = 0;
		int cur = i;
		for(int j=20;j>=0;j--)
			if(p[pr[cur][j]].F>l2[i]&&p[pr[cur][j]].S<=r2[i])
				cur = pr[cur][j],ans1 += 1<<j;
				
		if(ans1>=ans){
			ans = ans1;
			ret = i-1;
		}
	}
	return ret;
}

Compilation message

tournament.cpp: In function 'int GetBestPosition(int, int, int, int*, int*, int*)':
tournament.cpp:138:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  138 |   for(int i=0;i<vec.size();i++)
      |               ~^~~~~~~~~~~
tournament.cpp:141:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  141 |   for(int i=0;i<vec.size()-1;i++)
      |               ~^~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 16 ms 23868 KB Output is correct
2 Correct 14 ms 23904 KB Output is correct
3 Correct 15 ms 23972 KB Output is correct
4 Correct 16 ms 24012 KB Output is correct
5 Correct 14 ms 23884 KB Output is correct
6 Correct 14 ms 24012 KB Output is correct
7 Correct 16 ms 24012 KB Output is correct
8 Correct 15 ms 23940 KB Output is correct
9 Correct 14 ms 23884 KB Output is correct
10 Correct 16 ms 23864 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 17 ms 24128 KB Output is correct
2 Correct 24 ms 25912 KB Output is correct
3 Correct 20 ms 25036 KB Output is correct
4 Correct 27 ms 25676 KB Output is correct
5 Correct 23 ms 25560 KB Output is correct
6 Correct 25 ms 25432 KB Output is correct
7 Correct 24 ms 25852 KB Output is correct
8 Correct 23 ms 25772 KB Output is correct
9 Correct 19 ms 24908 KB Output is correct
10 Correct 23 ms 25696 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 103 ms 38944 KB Output is correct
2 Correct 239 ms 63608 KB Output is correct
3 Correct 135 ms 45072 KB Output is correct
4 Correct 209 ms 60968 KB Output is correct
5 Correct 212 ms 60748 KB Output is correct
6 Correct 213 ms 53728 KB Output is correct
7 Correct 213 ms 61916 KB Output is correct
8 Correct 212 ms 62016 KB Output is correct
9 Correct 145 ms 44128 KB Output is correct
10 Correct 131 ms 44944 KB Output is correct