Submission #121186

#TimeUsernameProblemLanguageResultExecution timeMemory
121186MAMBAJousting tournament (IOI12_tournament)C++17
100 / 100
167 ms41980 KiB
#include <bits/stdc++.h>

using namespace std;

#define rep(i , j , k) for(int i = j; i < (int)k; i++)

constexpr int MAXN = 1e5 + 10;

struct node {
	node* par[20];
	int l, r;
	node(int l_, int r_) {
		rep(i , 0 , 20) par[i]= NULL;
		l = l_, r = r_;
	}
	void relax() {
		rep(i,  1 , 20)
			if (par[i - 1])
				par[i] = par[i - 1]->par[i - 1];
	}
};

node* a[MAXN];
node* b[MAXN];
node* state[MAXN << 1];
int cnt;

int seg[MAXN << 2];
int le[MAXN], ri[MAXN];

int segGet(int p , int l ,int r, int id = 1) {
	if (l == r - 1) return l;
	int mid = l + r >> 1;
	if (seg[id << 1] >= p) return segGet(p , l , mid ,id << 1);
	return segGet(p - seg[id << 1] , mid , r ,id << 1 | 1);
}

void segFlip(int p, int l , int r, int id = 1) {
	if (l == r - 1) {
		seg[id] ^= 1;
		return;
	}
	int mid = l + r >> 1;
	if (p < mid) segFlip(p , l , mid , id << 1);
	else segFlip(p , mid , r , id << 1 | 1);
	seg[id] = seg[id << 1] + seg[id << 1 | 1];
}

bool smax(int &l, int r) { 
	if (l < r) {
		l = r;
		return true;
	}
	return false;
}
bool smin(int &l, int r) { 
	if (l > r) {
		l = r;
		return true;
	}
	return false;
}


int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) {

	rep(i , 0 , N) {
		segFlip(i , 0 , N);
		state[cnt++] = a[i] = b[i] = new node(i , i);
	}

	rep(i , 0 , C) {
		int s = S[i] + 1;
		int sz = E[i] - S[i] + 1;
		int last = -1, l = 1e9, r = -1;
		node * root = new node(-1 , -1);
		rep(z , 0 , sz) {
			last = segGet(s , 0 , N);
			smin(l , b[last]->l);
			smax(r , b[last]->r);
			b[last]->par[0] = root;
			segFlip(last , 0 , N);
		}
		segFlip(last , 0 , N);
		root->l = l;
		root->r = r;
		b[last] = root;
		state[cnt++] = root;
	}


	le[0] = -1e9;
	rep(i , 1 , N) {
		le[i] = le[i - 1];
		if (K[i - 1] > R)
			le[i] = i - 1;
	}
	ri[N - 1] = 1e9;
	for (int i = N - 2; ~i; i--) {
		ri[i] = ri[i  + 1];
		if (K[i] > R) ri[i] = i + 1;
	}

	for (int i = cnt - 1; ~i; i--)
		state[i]->relax();

	int pos = 0, res = -1;

	rep(i , 0 , N) {
		int local = 0;
		node * now = a[i];
		for (int j = 19; ~j; j--) {
			if (now->par[j] && now->par[j]->l > le[i] && now->par[j]->r < ri[i]) {
				local |= 1 << j;
				now = now->par[j];
			}
		}
		if (smax(res , local))
			pos = i;
	}	

	return pos;
}

Compilation message (stderr)

tournament.cpp: In function 'int segGet(int, int, int, int)':
tournament.cpp:33:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = l + r >> 1;
            ~~^~~
tournament.cpp: In function 'void segFlip(int, int, int, int)':
tournament.cpp:43:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = l + r >> 1;
            ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...