Submission #541773

#TimeUsernameProblemLanguageResultExecution timeMemory
541773NachoLibreTeams (IOI15_teams)C++17
100 / 100
1493 ms524288 KiB
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define vint vector<int>
using namespace std;
#ifndef x
#include "teams.h"
#else
#endif

const int N = 500005, S = 200005;
int n, a[N], b[N], m, k[S], dp[S];
vector<int> e[N];

struct zz {
	zz *l = 0, *r = 0;
	vector<int> v;
	vector<array<int, 2> > t, lv, rv;
	void P() {
		// cout << "-" << endl;
		// cout << "+" << endl;
		int li = 0, ri = 0;
		while(li < sz(l->v) || ri < sz(r->v)) {
			if(li == sz(l->v) || (ri < sz(r->v) && r->v[ri] < l->v[li])) {
				v.push_back(r->v[ri]);
				t.push_back({1, ri});
				ri += 1;
			} else /* if(ri == sz(r->v) || r->v[ri] >= l->v[li]) */ {
				v.push_back(l->v[li]);
				t.push_back({0, li});
				li += 1;
			}
		}
		lv.resize(sz(v), {-1, -1});
		rv.resize(sz(v), {-1, -1});
		for(int i = 0; i < sz(v); ++i) {
			if(t[i][0] == 0) lv[i][0] = t[i][1];
			else if(i) lv[i][0] = lv[i - 1][0];
			if(t[i][0] == 1) rv[i][0] = t[i][1];
			else if(i) rv[i][0] = rv[i - 1][0];
		}
		for(int i = sz(v) - 1; i >= 0; --i) {
			if(t[i][0] == 0) lv[i][1] = t[i][1];
			else if(i < sz(v) - 1) lv[i][1] = lv[i + 1][1];
			if(t[i][0] == 1) rv[i][1] = t[i][1];
			else if(i < sz(v) - 1) rv[i][1] = rv[i + 1][1];
		}
	}
	void add(int x) {
		v.push_back(x);
		t.push_back({0, 0});
		lv.push_back({0, 0});
		rv.push_back({0, 0});
	}
} *root;

void bld(int l = 1, int r = n + 1, zz *&t = root) {
	if(!t) t = new zz();
	if(l == r) {
		for(int i = 0; i < sz(e[l]); ++i) {
			t->add(e[l][i]);
		}
		return;
	}
	int m = l + r >> 1;
	bld(l, m, t->l);
	bld(m + 1, r, t->r);
	t->P();
} //

int cnt(int vl, int vr, int sl, int l = 1, int r = n + 1, zz *&t = root) {
	if(!t || vl > vr || vl == -1 || vr == -1) { return 0; }
	if(r < sl) return 0;
	if(l >= sl) return vr - vl + 1;
	int m = l + r >> 1;
	return cnt(t->lv[vl][1], t->lv[vr][0], sl, l, m, t->l) + cnt(t->rv[vl][1], t->rv[vr][0], sl, m + 1, r, t->r);
} //

int Z(int i, int j) {
	// [k[i] + 1, k[j]] x [k[j], +oo)
	int xl = (i == -1 ? 1 : k[i] + 1), xr = k[j], sl = k[j];
	int vl = lower_bound(all(root->v), xl) - (root->v).begin();
	int vr = int(upper_bound(all(root->v), xr) - (root->v).begin()) - 1;
	return cnt(vl, vr, sl);
} //

void init(int _n, int _a[], int _b[]) {
	n = _n;
	for(int i = 0; i < n; ++i) {
		a[i] = _a[i];
		b[i] = _b[i];
		e[b[i]].push_back(a[i]);
	}
	for(int i = 1; i <= n; ++i) {
		sort(all(e[i]));
	}
	bld();
	// cout << "BLD" << endl;
} //

array<int, 2> mir(int vl, int vr, int cr, int l = 1, int r = n + 1, zz *&t = root) {
	if(!t || vl > vr || vl == -1 || vr == -1) { vl = 1; vr = 0; }
	if(l == r) {
		int ncr = cr - (vr - vl + 1);
		if(ncr >= 0) return {l, ncr};
		return {r + 1, cr};
	}
	if(vr - vl + 1 <= cr) {
		return {l, cr - (vr - vl + 1)};
	}
	int m = l + r >> 1;
	array<int, 2> x = mir(t->rv[vl][1], t->rv[vr][0], cr, m + 1, r, t->r);
	if(x[0] == m + 1) {
	}
}

int mindx(int i, int j) {
	if(0) {
		int xl = (i == -1 ? 1 : k[i] + 1), xr = k[j];
		int vl = lower_bound(all(root->v), xl) - (root->v).begin();
		int vr = int(upper_bound(all(root->v), xr) - (root->v).begin()) - 1;
		int cr = dp[j] - dp[i];
		int y = mir(vl, vr, cr)[0];
		// dp[j] - dp[i] > [k[i] + 1, k[j]] x [y, +oo)
	} else { // // // // // // // //
		if(dp[i] + Z(i, m - 1) >= dp[j] + Z(j, m - 1)) {
			return m;
		}
		int l = j, r = m - 1;
		while(l < r) {
			int md = l + r >> 1;
			if(dp[i] + Z(i, md) < dp[j] + Z(j, md)) r = md;
			else l = md + 1;
		}
		return l;
	} //
}

multiset<int> sx;
multiset<array<int, 2> > sy;
void insert_51(int i) {
	int x = -1;
	if(sz(sx)) x = *(--sx.end());
	sx.insert(i);
	if(x == -1) return;
	sy.insert({mindx(x, i), i});
} //

bool pop_51(int i) {
	if(!sz(sy) || (*sy.begin())[0] > i) {
		return 0;
	}
	int x = (*sy.begin())[1];
	sy.erase(sy.begin());
	auto it = sx.find(x);
	sx.erase(it++);
	if(it == sx.end()) return 1;
	int z = *it;
	it--;
	int y = *it;
	sy.erase(sy.find({mindx(x, z), z}));
	sy.insert({mindx(y, z), z});
	return 1;
} //

void clear_51() {
	sx.clear();
	sy.clear();
} //

int can(int _m, int _k[]) {
	clear_51();
	m = _m;
	for(int i = 0; i < m; ++i) {
		dp[i] = 0;
		// // // //
		k[i] = _k[i];
	}
	sort(k, k + m);
	dp[0] = Z(-1, 0) - k[0]; ///
	insert_51(0);
	int dr = dp[0];
	for(int i = 1; i < m; ++i) {
		while(pop_51(i));
		int x = *(--sx.end());
		dp[i] = dp[x] + Z(x, i) - k[i];
		dp[i] = min(dp[i], Z(-1, i) - k[i]);
		dr = min(dr, dp[i]);
		insert_51(i);
	}
	return dr >= 0;
} //

#ifdef x
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	freopen("x.txt", "r", stdin);
    int N;
    cin >> N;
    int *A = (int*)malloc(sizeof(int)*(unsigned int)N);
    int *B = (int*)malloc(sizeof(int)*(unsigned int)N);
    for (int i = 0; i < N; ++i) {
    	cin >> A[i];
    	cin >> B[i];
    }
    init(N, A, B);
    int Q;
    cin >> Q;
    for (int i = 0; i < Q; ++i) {
    	int M;
    	cin >> M;
		int *K = (int*)malloc(sizeof(int)*(unsigned int)M);
    	for (int j = 0; j < M; ++j) {
    		cin >> K[j];
    	}
    	// fprintf(_outputFile,"%d\n", can(M, K));
		cout << can(M, K) << endl;
    }
	return 0;
}
#endif

Compilation message (stderr)

teams.cpp: In function 'void bld(int, int, zz*&)':
teams.cpp:67:6: warning: declaration of 'm' shadows a global declaration [-Wshadow]
   67 |  int m = l + r >> 1;
      |      ^
teams.cpp:14:20: note: shadowed declaration is here
   14 | int n, a[N], b[N], m, k[S], dp[S];
      |                    ^
teams.cpp:67:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   67 |  int m = l + r >> 1;
      |          ~~^~~
teams.cpp: In function 'int cnt(int, int, int, int, int, zz*&)':
teams.cpp:77:6: warning: declaration of 'm' shadows a global declaration [-Wshadow]
   77 |  int m = l + r >> 1;
      |      ^
teams.cpp:14:20: note: shadowed declaration is here
   14 | int n, a[N], b[N], m, k[S], dp[S];
      |                    ^
teams.cpp:77:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   77 |  int m = l + r >> 1;
      |          ~~^~~
teams.cpp: In function 'int Z(int, int)':
teams.cpp:84:41: warning: conversion from '__gnu_cxx::__normal_iterator<int*, std::vector<int> >::difference_type' {aka 'long int'} to 'int' may change value [-Wconversion]
   84 |  int vl = lower_bound(all(root->v), xl) - (root->v).begin();
      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
teams.cpp: In function 'std::array<int, 2> mir(int, int, int, int, int, zz*&)':
teams.cpp:113:6: warning: declaration of 'm' shadows a global declaration [-Wshadow]
  113 |  int m = l + r >> 1;
      |      ^
teams.cpp:14:20: note: shadowed declaration is here
   14 | int n, a[N], b[N], m, k[S], dp[S];
      |                    ^
teams.cpp:113:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  113 |  int m = l + r >> 1;
      |          ~~^~~
teams.cpp: In function 'int mindx(int, int)':
teams.cpp:122:42: warning: conversion from '__gnu_cxx::__normal_iterator<int*, std::vector<int> >::difference_type' {aka 'long int'} to 'int' may change value [-Wconversion]
  122 |   int vl = lower_bound(all(root->v), xl) - (root->v).begin();
      |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
teams.cpp:125:7: warning: unused variable 'y' [-Wunused-variable]
  125 |   int y = mir(vl, vr, cr)[0];
      |       ^
teams.cpp:133:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  133 |    int md = l + r >> 1;
      |             ~~^~~
teams.cpp: In function 'std::array<int, 2> mir(int, int, int, int, int, zz*&)':
teams.cpp:115:10: warning: control reaches end of non-void function [-Wreturn-type]
  115 |  if(x[0] == m + 1) {
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...