Submission #830857

#TimeUsernameProblemLanguageResultExecution timeMemory
830857tranxuanbachMeetings (IOI18_meetings)C++17
19 / 100
428 ms2900 KiB
#include "meetings.h"

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

#define For(i, l, r) for (auto i = (l); i < (r); i++)
#define ForE(i, l, r) for (auto i = (l); i <= (r); i++)
#define FordE(i, l, r) for (auto i = (l); i >= (r); i--)
#define isz(a) ((signed)a.size())

using ll = long long;

struct query{
	int l, r;
};

const int N = 750'000 + 5;

int n, q;
int a[N];
query b[N];

ll ans[N];

namespace subtask12{
	bool check(){
		return n <= 5000 and q <= 5000;
	}

	struct monotonic_stack{
		vector <pair <int, int>> st;
		ll sum;

		monotonic_stack(){
			st.clear();
			sum = 0;
		}

		void insert(int x){
			int len = 1;
			while (not st.empty() and st.back().first <= x){
				len += st.back().second;
				sum -= (ll)st.back().first * st.back().second;
				st.pop_back();
			}
			st.emplace_back(x, len);
			sum += (ll)x * len;
		}
	};

	ll tans[N];

	vector <ll> solve(){
		For(iq, 0, q){
			auto &[l, r] = b[iq];
			ForE(i, l, r){
				tans[i] = -a[i];
			}

			monotonic_stack st;
			ForE(i, l, r){
				st.insert(a[i]);
				tans[i] += st.sum;
			}
			st = monotonic_stack();
			FordE(i, r, l){
				st.insert(a[i]);
				tans[i] += st.sum;
			}
			ans[iq] = *min_element(tans + l, tans + r + 1);
		}
		return vector <ll>(ans, ans + q);
	}
}

namespace subtask3{
	bool check(){
		return n <= 100'000 and *max_element(a, a + n) <= 2;
	}

	const int N = 1e5 + 5, LN = 17;

	vector <int> pos2;
	int delta[N];
	int sptb[LN][N];

	int query(int l, int r){
		int j = __lg(r - l + 1);
		return max(sptb[j][l], sptb[j][r - (1 << j) + 1]);
	}

	vector <ll> solve(){
		pos2.emplace_back(-1);
		For(i, 0, n){
			if (a[i] == 2){
				pos2.emplace_back(i);
			}
		}
		pos2.emplace_back(n);
		For(i, 0, n){
			if (a[i] == 2){
				delta[i] = 0;
			}
			else{
				auto itr = --upper_bound(pos2.begin(), pos2.end(), i);
				delta[i] += i - *itr;
				itr++;
				delta[i] += *itr - i;
			}
		}

		For(i, 0, n){
			sptb[0][i] = delta[i];
		}
		For(j, 1, LN){
			ForE(i, 0, n - (1 << j)){
				sptb[j][i] = max(sptb[j - 1][i], sptb[j - 1][i + (1 << (j - 1))]);
			}
		}

		For(iq, 0, q){
			auto &[l, r] = b[iq];
			auto tl = *lower_bound(pos2.begin(), pos2.end(), l);
			auto tr = *(--upper_bound(pos2.begin(), pos2.end(), r));
			if (tl > r){
				ans[iq] = r - l + 1;
				continue;
			}
			ans[iq] = 2 * (r - l + 1) - max({tl - l, r - tr, query(tl, tr)});
		}
		return vector <ll>(ans, ans + q);
	}
}

vector <ll> minimum_costs(vector <int> _a, vector <int> _l, vector <int> _r){
	n = isz(_a);
	q = isz(_l);
	For(i, 0, n){
		a[i] = _a[i];
	}
	For(i, 0, q){
		auto l = _l[i], r = _r[i];
		b[i] = query{l, r};
	}

	if (subtask12::check()){
		return subtask12::solve();
	}
	if (subtask3::check()){
		return subtask3::solve();
	}
	return {};
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...