Submission #697783

#TimeUsernameProblemLanguageResultExecution timeMemory
697783vjudge1Holiday (IOI14_holiday)C++17
100 / 100
597 ms52232 KiB
/* ...... */

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

#define inl inline
#define newl putchar('\n')
typedef long long ll;
// typedef unsigned long long ull;
// typedef __int128 lll;
// typedef long double llf;
typedef pair <int, int> pint;
#define fst first
#define scd second
#define all(p) begin (p), end (p)
#define empb emplace_back

constexpr int N = 1e5 + 10;
int n, a[N], haji, mxt, arr[N], tt[N], tcnt;
ll f_r[N*3], f_l[N*3], g_r[N*3], g_l[N*3], ans;

struct node { int ls, rs, cnt; ll sum; } t[N*20];
int ntot, rt[N], tar;
inl void post (node &nde) {
	nde.sum = t[nde.ls].sum + t[nde.rs].sum,
	nde.cnt = t[nde.ls].cnt + t[nde.rs].cnt;
}
void _insert (int p, int &q, int l, int r) {
	t[q = ++ntot] = t[p];
	if (l == r) { ++t[q].cnt, t[q].sum += tt[l]; return; }
	int mid = l + r >> 1;
	tar <= mid ? _insert (t[p].ls, t[q].ls, l, mid)
		: _insert (t[p].rs, t[q].rs, mid + 1, r);
	post (t[q]);
}
inl void insert (int p, int &q, int num) {
	tar = num, _insert (p, q, 1, tcnt); }
ll query (int p, int q, int l, int r, int k) {
	if (k <= 0) return 0;
	if (l == r) return (ll) min (t[q].cnt-t[p].cnt, k) * tt[l];
	int mid = l + r >> 1, rht;
	if (t[q].cnt == t[p].cnt) return 0;
	if ((rht = t[t[q].rs].cnt-t[t[p].rs].cnt) >= k)
		return query (t[p].rs, t[q].rs, mid + 1, r, k);
	else return t[t[q].rs].sum - t[t[p].rs].sum + 
		query (t[p].ls, t[q].ls, l, mid, k - rht);
}

int qtot;
template <ll f[], int co, typename F>
void solve (int L, int R, int l, int r, const F &kmx_sum) {
	int mid = L + R >> 1, fr;
	ll res; f[mid] = -1;
	for (int i = l; i <= r; ++i)
		if ((res = kmx_sum (i, mid-co*i)) > f[mid])
			f[mid] = res, fr = i;
	if (mid > L) solve <f, co> (L, mid-1, l, fr, kmx_sum);
	if (mid < R) solve <f, co> (mid+1, R, fr, r, kmx_sum);
}

ll findMaxAttraction (int _n, int _haji, int _mxt, int _a[]) {
	n = _n, haji = ++_haji, mxt = _mxt;
	memcpy (a + 1, _a, n<<2),
	memcpy (tt, a, n + 1<<2);

	sort (tt + 1, tt + n + 1);
	tcnt = unique (tt + 1, tt + n + 1) - tt - 1;
	for (int x = 1; x <= n; ++x)
		insert (rt[x-1], rt[x], a[x] = lower_bound
			(tt + 1, tt + tcnt + 1, a[x]) - tt);
	const auto jun = [&] (int i, int k) {
		return query (rt[haji], rt[i+haji], 1, tcnt, k); };
	const auto gya = [&] (int i, int k) {
		return query (rt[haji-i-1], rt[haji-1], 1, tcnt, k); };
	solve <f_r, 1> (0, mxt, 0, n - haji, jun);
	solve <f_l, 1> (0, mxt, 0, haji - 1, gya);
	solve <g_r, 2> (0, mxt, 0, n - haji, jun);
	solve <g_l, 2> (0, mxt, 0, haji - 1, gya);
	for (auto &f : { f_l, f_r, g_l, g_r })
		for (int x = 1; x <= mxt; ++x)
			f[x] = max (f[x], f[x-1]);
	for (int x = 0; x <= mxt; ++x)
		ans = max (ans, max (f_r[x] + g_l[mxt-x],
			f_l[x] + g_r[mxt-x]));
	for (int x = 0; x < mxt; ++x)
		ans = max (ans, max (f_r[x] + g_l[mxt-x-1],
			f_l[x] + g_r[mxt-x-1]) + tt[a[haji]]);
	return ans;
}

Compilation message (stderr)

holiday.cpp: In function 'void _insert(int, int&, int, int)':
holiday.cpp:32:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   32 |  int mid = l + r >> 1;
      |            ~~^~~
holiday.cpp: In function 'll query(int, int, int, int, int)':
holiday.cpp:42:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   42 |  int mid = l + r >> 1, rht;
      |            ~~^~~
holiday.cpp: In function 'll findMaxAttraction(int, int, int, int*)':
holiday.cpp:65:19: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   65 |  memcpy (tt, a, n + 1<<2);
      |                 ~~^~~
holiday.cpp: In instantiation of 'void solve(int, int, int, int, const F&) [with ll* f = (& f_r); int co = 1; F = findMaxAttraction(int, int, int, int*)::<lambda(int, int)>]':
holiday.cpp:76:42:   required from here
holiday.cpp:53:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   53 |  int mid = L + R >> 1, fr;
      |            ~~^~~
holiday.cpp: In instantiation of 'void solve(int, int, int, int, const F&) [with ll* f = (& f_l); int co = 1; F = findMaxAttraction(int, int, int, int*)::<lambda(int, int)>]':
holiday.cpp:77:42:   required from here
holiday.cpp:53:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
holiday.cpp: In instantiation of 'void solve(int, int, int, int, const F&) [with ll* f = (& g_r); int co = 2; F = findMaxAttraction(int, int, int, int*)::<lambda(int, int)>]':
holiday.cpp:78:42:   required from here
holiday.cpp:53:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
holiday.cpp: In instantiation of 'void solve(int, int, int, int, const F&) [with ll* f = (& g_l); int co = 2; F = findMaxAttraction(int, int, int, int*)::<lambda(int, int)>]':
holiday.cpp:79:42:   required from here
holiday.cpp:53:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
holiday.cpp: In function 'void solve(int, int, int, int, const F&) [with ll* f = (& g_l); int co = 2; F = findMaxAttraction(int, int, int, int*)::<lambda(int, int)>]':
holiday.cpp:58:29: warning: 'fr' may be used uninitialized in this function [-Wmaybe-uninitialized]
   58 |  if (mid > L) solve <f, co> (L, mid-1, l, fr, kmx_sum);
      |               ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
holiday.cpp: In function 'void solve(int, int, int, int, const F&) [with ll* f = (& g_r); int co = 2; F = findMaxAttraction(int, int, int, int*)::<lambda(int, int)>]':
holiday.cpp:58:29: warning: 'fr' may be used uninitialized in this function [-Wmaybe-uninitialized]
   58 |  if (mid > L) solve <f, co> (L, mid-1, l, fr, kmx_sum);
      |               ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
holiday.cpp: In function 'void solve(int, int, int, int, const F&) [with ll* f = (& f_r); int co = 1; F = findMaxAttraction(int, int, int, int*)::<lambda(int, int)>]':
holiday.cpp:58:29: warning: 'fr' may be used uninitialized in this function [-Wmaybe-uninitialized]
   58 |  if (mid > L) solve <f, co> (L, mid-1, l, fr, kmx_sum);
      |               ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
holiday.cpp: In function 'void solve(int, int, int, int, const F&) [with ll* f = (& f_l); int co = 1; F = findMaxAttraction(int, int, int, int*)::<lambda(int, int)>]':
holiday.cpp:58:29: warning: 'fr' may be used uninitialized in this function [-Wmaybe-uninitialized]
   58 |  if (mid > L) solve <f, co> (L, mid-1, l, fr, kmx_sum);
      |               ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...