Submission #946135

# Submission time Handle Problem Language Result Execution time Memory
946135 2024-03-14T10:45:11 Z yhkhoo Jousting tournament (IOI12_tournament) C++17
100 / 100
442 ms 13528 KB
// late knights in the middle of june...

#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> pii;
#define mp make_pair
#define fi first
#define se second

#define lsb(x) ((x) & (-x))

const int MAXN = 100005;
int fw1[MAXN];
int fw2[MAXN];
void update(int *fw, int X, int V){
	X++;
	while(X<MAXN){
		fw[X] += V;
		X += lsb(X);
	}
}
int query(int *fw, int R){
	R++;
	if(R==0) return 0;
	int result = 0;
	while(R){
		result += fw[R];
		R -= lsb(R);
	}
	return result;
}
int fbs(int *fw, int V){
	int pos=0;
	int cs=0;
	for(int x=16; x>=0; x--){
		if(pos+(1<<x) >= MAXN) continue;
		if(cs + fw[pos+(1<<x)] < V){
			pos += 1<<x;
			cs += fw[pos];
		}
	}
	return pos;
}

struct node{
	int s, e, m;
	int val;
	node *l, *r;
	
	node(int S, int E){
		s = S, e = E, m = (s+e)/2;
		val = 0;
		if(s != e){
			l = new node(s, m);
			r = new node(m+1, e);
		}
	}
	
	void update(int X, int V){
		if(s == X && e == X){
			val = V;
		}
		else{
			if(X <= m) l->update(X, V);
			else r->update(X, V);
			
			val = max(l->val, r->val);
		}
	}
	
	int query(int S, int E){
		if(s == S && e == E) return val;
		else if(E<=m) return l->query(S, E);
		else if(S>m) return r->query(S, E);
		else return max(l->query(S, m), r->query(m+1, E));
	}
} *root;

int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) {
	cerr << '\n';
	memset(fw1, 0, sizeof(fw1));
	for(int i=1; i<=N; i++){
		update(fw1, i, 1);
	}
	pii q[C];
	/*for(int i=0; i<C; i++){
		int rs = fbs(fw1, S[i]);
		int re = fbs(fw1, E[i]+1)-1;
		q[i] = mp(rs, re);
		int ts;
		while((ts = fbs(fw1, rs+1)) <= re){
			update(fw1, ts, -1);
		}
		cerr << rs << ' ' << re << '\n';
	}*/
	vector<int> goat;
	goat.reserve(N+1);
	for(int i=0; i<=N; i++){
		goat.push_back(i);
	}
	for(int i=0; i<C; i++){
		int rs = goat[S[i]];
		int re = goat[E[i]+1]-1;
		/*cerr << rs << ' ' << re << '\n';
		for(auto j: goat){
			cerr << j << ' ';
		}
		cerr << '\n';*/
		q[i] = mp(rs, re);
		/*for(int j=S[i]+1; j<=E[i]; j++){
			goat.erase(goat.begin()+S[i]+1);
		}*/
		goat.erase(goat.begin()+S[i]+1, goat.begin()+E[i]+1);
	}
	root = new node(0, N-2);
	for(int i=0; i<N-1; i++){
		root->update(i, K[i]);
	}
	memset(fw2, 0, sizeof(fw2));
	for(int i=0; i<C; i++){
		int cmax = root->query(q[i].fi, q[i].se-1);
		if(cmax < R){
			update(fw2, q[i].fi, 1);
			update(fw2, q[i].se+1, -1);
		}
	}
	int cmax=0, P=0;
	for(int i=0; i<N; i++){
		int temp = query(fw2, i);
		/*int temp = 0;
		for(int j=0; j<C; j++){
			if(i >= q[j].fi && i <= q[j].se && root->query(q[j].fi, q[j].se-1) < R){
				temp++;
			}
		}*/
		cerr << temp << ' ';
		if(temp > cmax){
			cmax = temp;
			P = i;
		}
	}
	cerr << '\n';
	return P;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 1116 KB Output is correct
2 Correct 1 ms 1116 KB Output is correct
3 Correct 2 ms 1116 KB Output is correct
4 Correct 2 ms 1116 KB Output is correct
5 Correct 3 ms 1116 KB Output is correct
6 Correct 2 ms 1116 KB Output is correct
7 Correct 2 ms 1116 KB Output is correct
8 Correct 2 ms 1116 KB Output is correct
9 Correct 3 ms 1116 KB Output is correct
10 Correct 2 ms 1368 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 1116 KB Output is correct
2 Correct 14 ms 1624 KB Output is correct
3 Correct 12 ms 1592 KB Output is correct
4 Correct 14 ms 1628 KB Output is correct
5 Correct 13 ms 1960 KB Output is correct
6 Correct 13 ms 1628 KB Output is correct
7 Correct 15 ms 1628 KB Output is correct
8 Correct 16 ms 1628 KB Output is correct
9 Correct 12 ms 1628 KB Output is correct
10 Correct 14 ms 1628 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 155 ms 6920 KB Output is correct
2 Correct 442 ms 13424 KB Output is correct
3 Correct 275 ms 11600 KB Output is correct
4 Correct 410 ms 13528 KB Output is correct
5 Correct 431 ms 12628 KB Output is correct
6 Correct 377 ms 13204 KB Output is correct
7 Correct 394 ms 13092 KB Output is correct
8 Correct 432 ms 13092 KB Output is correct
9 Correct 243 ms 11600 KB Output is correct
10 Correct 286 ms 11604 KB Output is correct