Submission #1340394

#TimeUsernameProblemLanguageResultExecution timeMemory
1340394nicolo_010Holiday (IOI14_holiday)C++20
23 / 100
57 ms12840 KiB
#include <bits/stdc++.h>
#include "holiday.h"
using namespace std;
using ll = long long;
using pii = pair<int, int>;

struct SegTree {
	struct Node {
		int cnt=0;
		ll val=0;
	};
	vector<Node> tree;
	SegTree(int n) {
		tree.assign(4*n, {});
	}
	void query(int p, int l, int r, int i, int x) {
		if (l>i || r<i) return;
		if (l==r) {
			tree[p].cnt = 1;
			tree[p].val = x;
			return;
		}
		int m = (l+r)/2;
		query(2*p, l, m, i, x);
		query(2*p+1, m+1, r, i, x);
		tree[p].cnt = tree[2*p].cnt + tree[2*p+1].cnt;
		tree[p].val = tree[2*p].val + tree[2*p+1].val;
	}
	ll rsq(int p, int l, int r, int i, int j) {
		if (l>j || r<i) return 0;
		if (i<=l && r<=j) return tree[p].val;
		int m = (l+r)/2;
		return rsq(2*p, l, m, i, j) + rsq(2*p+1, m+1, r, i, j);
	}
	int kth(int p, int l, int r, int k) {
		if (l==r) return l;
		int m = (l+r)/2;
		if (tree[2*p].cnt >= k) {
			return kth(2*p, l, m, k);
		}
		else {
			return kth(2*p+1, m+1, r, k-tree[2*p].cnt);
		}
	}
};

int s, d;

ll findMaxAttraction(int n, int S, int D, int A[]) {
	if (D==0) return 0;
	s = S;
	d = D;
	vector<int> a(n);
	for (int i=0; i<n; i++) {
		a[i] = A[i];
	}
	vector<pii> b(n);
	for (int i=0; i<n; i++) {
		b[i] = {a[i], i};
	}
	sort(b.begin(), b.end(), greater<pii>());
	map<int, int> mp;
	for (int i=0; i<n; i++) {
		mp[b[i].second] = i;
	}
	SegTree st(n);
	ll ans=0;
	for (int i=0; i<n; i++) {
		int t = d-i;
		st.query(1, 0, n-1, mp[i], a[i]);
		int j = st.kth(1, 0, n-1, t);
		ans = max(ans, st.rsq(1, 0, n-1, 0, j));
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...