Submission #212288

#TimeUsernameProblemLanguageResultExecution timeMemory
212288ksun48Constellation 3 (JOI20_constellation3)C++17
100 / 100
324 ms82552 KiB
#include <bits/stdc++.h>
using namespace std;

#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define trav(a, x) for(auto& a : x)
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

using ll = long long;

template<class T>
struct RMQ {
	vector<vector<T>> jmp;

	RMQ(const vector<T>& V) {
		int N = sz(V), on = 1, depth = 1;
		while (on < sz(V)) on *= 2, depth++;
		jmp.assign(depth, V);
		rep(i,0,depth-1) rep(j,0,N)
			jmp[i+1][j] = max(jmp[i][j],
			jmp[i][min(N - 1, j + (1 << i))]);
	}

	T query(int a, int b) {
		assert(a < b); // or return inf if a == b
		int dep = 31 - __builtin_clz(b - a);
		return max(jmp[dep][a], jmp[dep][b - (1 << dep)]);
	}
};

RMQ<pair<int,int> > rmq({});

vector<pair<int,int> > a;
vector<ll> base_cost;
vector<multiset<pair<int, ll> > > cost;
vector<ll> no_star_cost;

int merge(int x, int y){
	if(cost[x].size() < cost[y].size()) swap(x, y);
	for(pair<int, ll> p : cost[y]){
		cost[x].insert({p.first, p.second + no_star_cost[x] - no_star_cost[y]});
	}
	base_cost[x] += no_star_cost[y] + base_cost[y];
	return x;
}

int solve(int l, int r, int cap){
	int cur;
	if(l + 1 == r){
		cur = l;
	} else {
		pair<int,int> v = rmq.query(l, r);
		int best = v.second;
		int val = v.first;
		cur = solve(best, best + 1, val);
		if(l < best){
			cur = merge(cur, solve(l, best, val));
		}
		if(best + 1 < r){
			cur = merge(cur, solve(best + 1, r, val));
		}
	}
	while(!cost[cur].empty() && (*cost[cur].begin()).first <= cap){
		no_star_cost[cur] = max(no_star_cost[cur], (*cost[cur].begin()).second);
		cost[cur].erase(cost[cur].begin());
	}
	return cur;
}

int main(){
	ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n;
	cin >> n;
	a.resize(n);

	base_cost.resize(n);
	no_star_cost.resize(n);
	cost.resize(n);
	for(int i = 0; i < n; i++){
		cin >> a[i].first;
		a[i].second = i;
	}
	rmq = RMQ<pair<int,int> >(a);
	int m;
	cin >> m;
	ll tot_cost = 0;
	for(int i = 0; i < m; i++){
		ll x, y, c;
		cin >> x >> y >> c;
		x--;
		cost[x].insert({y, c});
		tot_cost += c;
	}
	int z = solve(0, n, n+1);
	cout << tot_cost - (no_star_cost[z] + base_cost[z]) << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...