Submission #778834

#TimeUsernameProblemLanguageResultExecution timeMemory
778834amunduzbaevMeetings (IOI18_meetings)C++17
19 / 100
505 ms2132 KiB
#include "meetings.h"

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

#ifndef EVAL
#include "grader.cpp"
#endif

#define ar array
typedef long long ll;
typedef int32_t ii;

vector<ll> minimum_costs(vector<int> a, vector<int> l, vector<int> r) {
	int n = a.size(), q = l.size();
	
	if(n <= 5000 && q <= 5000){
		vector<ll> res(q);
		
		auto get = [&](vector<int> a){
			int n = a.size();
			ll cur = 0;
			vector<int> ss;
			vector<ll> cost(n);
			for(int i=0;i<n;i++){
				while(!ss.empty() && a[ss.back()] <= a[i]){
					int id = ss.back();
					ss.pop_back();
					if(ss.empty()) cur -= a[id] * 1ll * (id + 1);
					else cur -= a[id] * 1ll * (id - ss.back());
				}
				
				if(ss.empty()) cur += a[i] * 1ll * (i + 1);
				else cur += a[i] * 1ll * (i - ss.back());
				ss.push_back(i);
				cost[i] += cur;
			}
			
			ss.clear(); cur = 0;
			for(int i= n - 1;~i;i--){
				while(!ss.empty() && a[ss.back()] <= a[i]){
					int id = ss.back();
					ss.pop_back();
					if(ss.empty()) cur -= a[id] * 1ll * (n - id);
					else cur -= a[id] * 1ll * (ss.back() - id);
				}
				
				if(ss.empty()) cur += a[i] * 1ll * (n - i);
				else cur += a[i] * 1ll * (ss.back() - i);
				ss.push_back(i);
				cost[i] += cur;
			}
			
			ll mn = 1e18;
			for(int i=0;i<n;i++){
				mn = min(mn, cost[i] - a[i]);
			}
			
			return mn;
		};
		
		for(int i=0;i<q;i++){
			vector<int> b;
			for(int j=l[i];j<=r[i];j++){
				b.push_back(a[j]);
			}
			
			res[i] = get(b);
		}
		
		return res;
	}
	
	assert(false);
	vector<ll> res(q);
	return res;
}
#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...