Submission #583428

# Submission time Handle Problem Language Result Execution time Memory
583428 2022-06-25T10:48:48 Z M_W Jousting tournament (IOI12_tournament) C++17
100 / 100
703 ms 15144 KB
#include <bits/stdc++.h>
#define ii pair<int, int>
using namespace std;
int a[100001], t[400004], lazy[400004], k[100001];
int t2[400004];

void build(int v, int tl, int tr){
	if(tl == tr){
		t[v] = 1; t2[v] = k[tl];
		return;
	}
	int tm = (tl + tr) >> 1;
	build(v * 2, tl, tm); build(v * 2 + 1, tm + 1, tr);
	t[v] = t[v * 2] + t[v * 2 + 1];
	t2[v] = max(t2[v * 2], t2[v * 2 + 1]);
}

void push(int v){
	if(lazy[v] != 1) return;

	t[v * 2] = 0;
	lazy[v * 2] = lazy[v];
	
	t[v * 2 + 1] = 0;
	lazy[v * 2 + 1] = lazy[v];
	
	lazy[v] = 0;
}

void ins(int v, int tl, int tr, int l, int r, int val){
	if(l > r) return;
	if(tl == l && tr == r){
		t[v] = 0;
		lazy[v] = 1;
		return;
	}
	push(v);
	int tm = (tl + tr) >> 1;
	ins(v * 2, tl, tm, l, min(r, tm), val);
	ins(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r, val);
	
	t[v] = t[v * 2] + t[v * 2 + 1];
	return;
}

int query(int v, int tl, int tr, int l, int r){
	if(l > r) return 0;
	if(tl == l && tr == r) return t[v];
	push(v);
	int tm = (tl + tr) >> 1;
	return query(v * 2, tl, tm, l, min(r, tm)) + query(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r);
}

int query_max(int v, int tl, int tr, int l, int r){
	if(l > r) return INT_MIN;
	if(tl == l && tr == r) return t2[v];
	int tm = (tl + tr) >> 1;
	return max(query_max(v * 2, tl, tm, l, min(r, tm)), query_max(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r));
}

vector<ii> v1[100001];
vector<int> v2[100001];
int val[100001], fwt[100001];
int nS[100001], nE[100001];

int query_f(int v){
	int ret = 0;
	v++;
	for(; v > 0; v -= (v & -v)) ret += fwt[v];
	return ret;
}

void ins_f(int v, int a){
	v++;
	for(; v <= 100000; v += (v & -v)){
		fwt[v] += a;
	}
}

int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) {
	for(int i = 0; i < N; i++) k[i] = K[i];
	build(1, 0, N - 1);
	
	for(int i = 0; i < C; i++){
		int l = 0, r = N - 1;
		while(l < r){
			int mid = (l + r) >> 1;
			int q = query(1, 0, N - 1, 0, mid);
			
			
			
			if(q >= S[i] + 1) r = mid;
			else l = mid + 1;
		}
		int head = l, diff = E[i] - S[i] + 1; r = N - 1;
		while(l < r){
			int mid = (l + r) >> 1;
			int q = query(1, 0, N - 1, head, mid);
			if(q >= diff) r = mid;
			else l = mid + 1;
		}
		
		int tail = l;
		l = 0; r = N - 1;
		while(l < r){
			int mid = (l + r) >> 1;
			int q = query(1, 0, N - 1, 0, mid);
			
			if(q >= S[i]) r = mid;
			else l = mid + 1;
		}
		
		head = S[i] == 0 ? 0 : l + 1;
		v1[head].push_back({tail, i}); v2[tail + 1].push_back(i);
		ins(1, 0, N - 1, head, tail - 1, 0);
		
		val[i] = query_max(1, 0, N - 1, head, tail - 1);
		
		nS[i] = head; nE[i] = tail;
	}
	int ans = 0, pos = 0;
	priority_queue<ii, vector<ii>, greater<ii>> pq;
	for(int i = 0; i < N; i++){
		
		while(!pq.empty() && pq.top().second < i){
			pq.pop();
		}
		for(auto x : v2[i]) ins_f(x, -1);
		for(auto x : v1[i]){
			if(val[x.second] > R) pq.push({x.second, x.first});
			ins_f(x.second, 1);
		}
		
		int new_ans;
		if(!pq.empty()) new_ans = max(ans, query_f(pq.top().first) - 1);
		else new_ans = max(ans, query_f(100000));
		
		if(new_ans > ans){
			ans = new_ans; pos = i;
		}
	}
	return pos;
}
# Verdict Execution time Memory Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 5076 KB Output is correct
3 Correct 5 ms 5204 KB Output is correct
4 Correct 4 ms 5076 KB Output is correct
5 Correct 3 ms 5076 KB Output is correct
6 Correct 4 ms 5076 KB Output is correct
7 Correct 4 ms 5076 KB Output is correct
8 Correct 6 ms 5076 KB Output is correct
9 Correct 3 ms 5076 KB Output is correct
10 Correct 11 ms 5076 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 5076 KB Output is correct
2 Correct 31 ms 5580 KB Output is correct
3 Correct 5 ms 5204 KB Output is correct
4 Correct 29 ms 5476 KB Output is correct
5 Correct 22 ms 5460 KB Output is correct
6 Correct 18 ms 5412 KB Output is correct
7 Correct 24 ms 5492 KB Output is correct
8 Correct 23 ms 5580 KB Output is correct
9 Correct 4 ms 5204 KB Output is correct
10 Correct 26 ms 5508 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 236 ms 8920 KB Output is correct
2 Correct 670 ms 15144 KB Output is correct
3 Correct 63 ms 8524 KB Output is correct
4 Correct 671 ms 14796 KB Output is correct
5 Correct 677 ms 14808 KB Output is correct
6 Correct 506 ms 12960 KB Output is correct
7 Correct 703 ms 14996 KB Output is correct
8 Correct 670 ms 14964 KB Output is correct
9 Correct 15 ms 8120 KB Output is correct
10 Correct 53 ms 9200 KB Output is correct