Submission #1013159

#TimeUsernameProblemLanguageResultExecution timeMemory
1013159jcelinJousting tournament (IOI12_tournament)C++14
100 / 100
79 ms9412 KiB
#include<bits/stdc++.h>

using namespace std;

#define X first
#define Y second
#define PB push_back
#define PPB pop_back
#define all(x) (x).begin(), (x).end()

typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef pair<ll, ll> pll;

const int inf = 1e9 + 7;
const int MAXN = 1e5 + 7;
const int logo = 17;
const int off = 1 << logo;
const int trsz = off << 1;
const int mod = 1e9;
const int dx[] = {0, 0, -1, 1};
const int dy[] = {1, -1, 0, 0};

struct tournament{
	int seg[trsz];
	
	void update(int x, int vl){
		x += off;
		seg[x] = vl;
		for(x /= 2; x; x /= 2) seg[x] = seg[x * 2] + seg[x * 2 + 1];
	}
	
	int query(int x, int k){
		if(x >= off) return (x - off) - 1;
		if(seg[x * 2] > k) return query(x * 2, k);
		k -= seg[x * 2];
		return query(x * 2 + 1, k);
	}
}t;

int pf[MAXN], p[MAXN], cnt[MAXN];
vi temp;
set<int> act;

int GetBestPosition(int n, int m, int rank, int *K, int *L, int *R) {
    for(int i=0; i<n; i++){
		if(i) pf[i] = pf[i - 1];
		if(i != n - 1 and K[i] > rank) pf[i]++;			
		t.update(i, 1);
		act.insert(i);
	}
	
    for(int i=0; i<m; i++){
        int l = t.query(1, L[i]) + 1;
        int r = min(t.query(1, R[i] + 1), n - 1);
        temp.clear();
        
        auto it = act.lower_bound(l);
        while(1){
			temp.PB(*it);
			it++;
			if(it == act.end() or *it > r) break;
		}
		
		for(auto &x : temp){
			t.update(x, 0);
			act.erase(x);
		}
        
        t.update(l, 1);
        act.insert(l);
        
        //mogu kickat zadnjeg
        
        int vl = pf[r - 1];
        if(l != 0) vl -= pf[l - 1];
        
        if(vl == 0){
			cnt[l]++;
			cnt[r + 1]--;	
		}
    }
    
    ii ans = {-inf, -inf};
    for(int i=0; i<n; i++){
		if(i) cnt[i] += cnt[i - 1];
		//cout << cnt[i] << " " << i << "\n";
		ans = max(ans, (ii){cnt[i], -i});
	}
    return -ans.Y;
}

/*
int kk[MAXN], le[MAXN], ri[MAXN]; 
void solve(){
	int n, m, ja;
	cin >> n >> m >> ja;
	for(int i=0; i<n-1; i++) cin >> kk[i];
	for(int i=0; i<m; i++) cin >> le[i] >> ri[i];
	cout << GetBestPosition(n, m, ja, kk, le, ri) << "\n";
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int _ = 1;
	//cin >> _;
	while(_--) solve();
	return 0;
}
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...