Submission #1293432

#TimeUsernameProblemLanguageResultExecution timeMemory
1293432Jawad_Akbar_JJHoliday (IOI14_holiday)C++20
100 / 100
979 ms34532 KiB
#include <iostream>
#include <map>

using namespace std;
#define ll long long
const ll N = (1<<17) + 1;
ll cr, cnt[N<<1], Sum[N<<1], SumL[N<<2], SumR[N<<2], rgt[N<<2], lft[N<<2], rev[N], a[N];
map<ll, ll> mp, mp2;

void insert(ll i, ll t, ll cur = 1, ll st = 1, ll en = N){
	if (i >= en or i < st)
		return;
	cnt[cur] += t;
	Sum[cur] += t * rev[i];
	
	if (en - st == 1)
		return;	

	ll lc = cur<<1, rc = lc + 1, mid = (st + en)>>1;

	insert(i, t, lc, st, mid);
	insert(i, t, rc, mid, en);
}

ll get(ll k, ll cur = 1, ll st = 1, ll en = N){
	if (en - st == 1)
		return min(k, cnt[cur]) * rev[st];
	ll lc = cur<<1, rc = lc + 1, mid = (st + en)>>1;

	if (cnt[rc] <= k)
		return Sum[rc] + get(k - cnt[rc], lc, st, mid);
	return get(k, rc, mid, en);
}

void solve1(ll l, ll r, ll st, ll en, ll S){
	if (l > r)
		return;
	ll mid = (l + r) / 2;

	rgt[mid] = st;
	for (ll i=st;i<=en;i++){
		// turn it on
		insert(a[i], 1);
		ll nw = get(max(mid - (i - S), 0LL));
		if (SumR[mid] < nw)
			SumR[mid] = nw, rgt[mid] = i;
	}
	
	for (ll i=rgt[mid];i<=en;i++)
		insert(a[i], -1);
	// turn some off
	solve1(mid + 1, r, rgt[mid], en, S);
	
	for (ll i=st;i<rgt[mid];i++)
		insert(a[i], -1);
	// turn remaining off
	solve1(l, mid - 1, st, rgt[mid], S);
}

void solve2(ll l, ll r, ll st, ll en, ll S){
	if (l > r)
		return;
	ll mid = (l + r) / 2;

	lft[mid] = en;
	for (ll i=en;i>=st;i--){
		// turn it on
		insert(a[i], 1);
		ll nw = get(max(mid - (S - i), 0LL));
		if (SumL[mid] < nw)
			SumL[mid] = nw, lft[mid] = i;
	}
	for (ll i=st;i<=lft[mid];i++)
		insert(a[i], -1);
	// turn some off
	solve2(mid + 1, r, st, lft[mid], S);

	for (ll i=lft[mid]+1;i<=en;i++)
		insert(a[i], -1);
	// turn remaining off
	solve2(l, mid - 1, lft[mid], en, S);
}
bool flg;
long long findMaxAttraction(int n, int s, int d, int at[]){
	// cout<<n<<" "<<s<<" "<<d<<endl;
	s += !flg, cr = 0;
	for (ll i=0;i<(N << 2);i++)
		lft[i] = rgt[i] = SumL[i] = SumR[i] = 0;

	for (ll i=1;i<=n;i++)
		a[i] = at[i-1], mp[a[i]];
	if (mp2.size() == 0){
		for (auto [i, j] : mp)
			mp2[i] = ++cr, rev[cr] = i;
	}
	for (ll i=1;i<=n;i++)
		a[i] = mp2[a[i]];

	solve1(0, d + 10, s, n, s);
	if (s > 1)
		solve2(0, d + 10, 1, s - 1, s - 1);

	ll Max = 0;
	for (ll i=0;i<=d;i++){
		ll k = max(0LL, d - (rgt[i] - s) - i - 1);
		Max = max(Max, SumR[i] + SumL[k]);
	}
	for (ll i=0;n - i - 1 > i;i++)
		swap(at[i], at[n - i - 1]);
	if (!flg)
		flg = 1, Max = max(Max, findMaxAttraction(n, n - s + 1, d, at));
	return Max;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...