Submission #802969

#TimeUsernameProblemLanguageResultExecution timeMemory
802969happypotatoTeams (IOI15_teams)C++17
0 / 100
386 ms37236 KiB
#include "teams.h"

#include <bits/stdc++.h>
using namespace std;
#define pii pair<int, int>
#define ff first
#define ss second
#define pb push_back
int n;
vector<pii> v;
bool cmp(pii &lhs, pii &rhs) {
	if (lhs.ss != rhs.ss) return lhs.ss < rhs.ss;
	return lhs.ff < rhs.ff;
}
const int mxN = 1e5 + 1;
vector<int> seg[4 * mxN];
void merge(vector<int> &res, vector<int> &lhs, vector<int> &rhs) {
	int lptr = 0, rptr = 0;
	while (lptr < lhs.size() && rptr < rhs.size()) {
		if (lhs[lptr] < rhs[rptr]) {
			res.pb(lhs[lptr]); lptr++;
		} else {
			res.pb(rhs[rptr]); rptr++;
		}
	}
	while (lptr < lhs.size()) {
		res.pb(lhs[lptr]); lptr++;
	}
	while (rptr < rhs.size()) {
		res.pb(rhs[rptr]); rptr++;
	}
}
void build(int l = 1, int r = n, int idx = 1) {
	if (l == r) {
		seg[idx] = {v[l].ff};
		return;
	}
	int mid = (l + r) >> 1;
	build(l, mid, (idx << 1));
	build(mid + 1, r, (idx << 1) | 1);
	merge(seg[idx], seg[(idx << 1)], seg[(idx << 1) | 1]);
}
int query(int st, int tar, int nos, int l = 1, int r = n, int idx = 1) {
	if (l == r) {
		if (nos == 1 && seg[idx][0] <= tar) return l;
		else return -1;
	}
	int mid = (l + r) >> 1;
	if (st <= l) {
		int cnts = upper_bound(seg[(idx << 1)].begin(), seg[(idx << 1)].end(), tar) - seg[(idx << 1)].begin();
		if (cnts >= nos) return query(st, tar, nos, l, mid, (idx << 1));
		else return query(st, tar, nos - cnts, mid + 1, r, (idx << 1) | 1);
	} else if (st <= mid) {
		int res = query(st, tar, nos, l, mid, (idx << 1));
		if (res != -1) return res;
		return query(st, tar, nos, mid + 1, r, (idx << 1) | 1);
	} else {
		return query(st, tar, nos, mid + 1, r, (idx << 1) | 1);
	}
}
void init(int N, int A[], int B[]) {
	n = N;
	v.resize(n + 1); v[0] = {0, 0};
	for (int i = 1; i <= n; i++) {
		v[i] = {A[i], B[i]};
	}
	sort(v.begin(), v.end(), cmp);
	build();
}

int can(int M, int K[]) {
	int m = M;
	vector<int> tar(m);
	for (int i = 0; i < m; i++) tar[i] = K[i];
	sort(tar.begin(), tar.end());
	int pos = 1;
	for (int &need : tar) {
		if (v[n].ss < need) return 0;
		int lb = 1, rb = n;
		while (lb < rb) {
			int mid = (lb + rb) >> 1;
			if (v[mid].ss >= need) rb = mid;
			else lb = mid + 1;
		}
		pos = max(pos, lb);
		int res = query(pos, need, need);
		if (res == -1) return 0;
		pos = res;
	}
	return true;
}
/*
fix pos (bounded by upper bound)
range descend find kth element >= tar (bounded by lower bound)
can be maintained by merge sort tree?
*/

Compilation message (stderr)

teams.cpp: In function 'void merge(std::vector<int>&, std::vector<int>&, std::vector<int>&)':
teams.cpp:19:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |  while (lptr < lhs.size() && rptr < rhs.size()) {
      |         ~~~~~^~~~~~~~~~~~
teams.cpp:19:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |  while (lptr < lhs.size() && rptr < rhs.size()) {
      |                              ~~~~~^~~~~~~~~~~~
teams.cpp:26:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   26 |  while (lptr < lhs.size()) {
      |         ~~~~~^~~~~~~~~~~~
teams.cpp:29:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |  while (rptr < rhs.size()) {
      |         ~~~~~^~~~~~~~~~~~
teams.cpp: In function 'int query(int, int, int, int, int, int)':
teams.cpp:50:79: warning: conversion from '__gnu_cxx::__normal_iterator<int*, std::vector<int> >::difference_type' {aka 'long int'} to 'int' may change value [-Wconversion]
   50 |   int cnts = upper_bound(seg[(idx << 1)].begin(), seg[(idx << 1)].end(), tar) - seg[(idx << 1)].begin();
      |              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...