Submission #1328046

#TimeUsernameProblemLanguageResultExecution timeMemory
1328046MateiKing80Nile (IOI24_nile)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
#define int ll

const int N = 100005;
const ll inf = 1e15;

struct obiect {
	ll w, a, b;
	const bool operator < (const obiect &oth) {
		return w < oth.w;
	}
};

struct SegMin {
	ll aint[4 * N];
	int n;
	void build(int pos, int st, int dr, vector<ll> &val) {
		if (st == dr) {
			aint[pos] = val[st];
			return;
		}
		int mid = (st + dr) / 2;
		build(2 * pos, st, mid, val);
		build(2 * pos + 1, mid + 1, dr, val);
		aint[pos] = min(aint[2 * pos], aint[2 * pos + 1]);
	}
	void init(int _n, vector<ll> val) {
		n = _n;
		build(1, 1, n, val);
	}
	void _update(int pos, int st, int dr, int loc, ll val) {
		if (st == dr) {
			aint[pos] = val;
			return;
		}
		int mid = (st + dr) / 2;
		if (loc <= mid) {
			_update(2 * pos, st, mid, loc, val);
		} else {
			_update(2 * pos + 1, mid + 1, dr, loc, val);
		}
		aint[pos] = min(aint[2 * pos], aint[2 * pos + 1]);
	}
	ll _query(int pos, int st, int dr, int l, int r) {
		if (l <= st && dr <= r) {
			return aint[pos];
		}
		int mid = (st + dr) / 2;
		if (r <= mid) {
			return _query(2 * pos, st, mid, l, r);
		} else if (mid < l) {
			return _query(2 * pos + 1, mid + 1, dr, l, r);
		} else {
			return min(_query(2 * pos, st, mid, l, r), _query(2 * pos + 1, mid + 1, dr, l, r));
		}
	}
	ll query(int l, int r) { 
		if (l > r) {
			return inf;
		}
		return _query(1, 1, n, l, r); 
	}
	void update(int pos, ll val) { _update(1, 1, n, pos, val); }
} par, impar, no2par, no2impar;
ll sp[N];

void update (int pos) {
	//cout << "Update: " << pos << '\n';
	if (pos % 2 == 0) {
		par.update(pos / 2 + 1, inf);
	} else {
		impar.update(pos / 2 + 1, inf);
	}
}

ll calc(int l, int r) {
	//cout << "Calc: " << l << " " << r << '\n';
	ll sum = sp[r + 1] - sp[l];
	//cout << "SUM: " << sum << '\n';
	if ((r - l + 1) % 2 == 0) {
		//cout << "SumPar: " << sum << '\n';
		return sum;
	}
	if (l % 2 == 1) {
		sum = sum + min(no2impar.query(l / 2 + 1, r / 2 + 1), par.query((l + 1) / 2 + 1, (r - 1) / 2 + 1));
	} else if (r != 0) {
		sum = sum + min(no2par.query(l / 2 + 1, r / 2 + 1), impar.query((l + 1) / 2 + 1, (r - 1) / 2 + 1));
	} else {
		sum = sum + no2par.query(1, 1);
	}
	//cout << "SumImpar: " << sum << '\n';
	return sum;
}

std::vector<long long> calculate_costs(std::vector<signed> w, std::vector<signed> a, std::vector<signed> b, std::vector<signed> e) {
	ll n = w.size(), q = e.size();
	vector<obiect> v;
	for (int i = 0; i < n; i ++) {
		v.push_back({w[i], a[i], b[i]});
	}
	vector<pair<ll, ll>> vp;
	for (int i = 0; i < q; i ++) {
		vp.push_back({e[i], i});
	}
	sort(v.begin(), v.end());
	sort(vp.begin(), vp.end());
	reverse(vp.begin(), vp.end());
	
	//for (auto i : v) {
		//cout << i.w << " " << i.a << " " << i.b << '\n';
	//}
	
	vector<ll> initPar(1, 0);
	for (int i = 0; i < n; i += 2) {
		initPar.push_back(v[i].a - v[i].b);
	}
	par.init(initPar.size() - 1, initPar);
	no2par.init(initPar.size() - 1, initPar);
	
	vector<ll> initImpar(1, 0);
	for (int i = 1; i < n; i += 2) {
		initImpar.push_back(v[i].a - v[i].b);
	}
	impar.init(initImpar.size() - 1, initImpar);
	no2impar.init(initImpar.size() - 1, initImpar);
	
	//cout << "SP: ";
	for (int i = 1; i <= n; i ++) {
		sp[i] = sp[i - 1] + v[i - 1].b;
		//cout << sp[i] << " ";
	}
	//cout << '\n';
	
	set<ll> brk;
	brk.insert(-1);
	brk.insert(n - 1);
	update(0);
	update(n - 1);
	ll ans = calc(0, n - 1);
	vector<pair<ll, ll>> diff, diff2;
	for (int i = 0; i < n - 1; i ++) {
		diff.push_back({v[i + 1].w - v[i].w, i});
		if (i) {
			diff2.push_back({v[i + 1].w - v[i - 1].w, i});
		}
	}
	int pdiff = 0, pdiff2 = 0;
	sort(diff.begin(), diff.end());
	sort(diff2.begin(), diff2.end());
	reverse(diff.begin(), diff.end());
	reverse(diff2.begin(), diff2.end());
	vector<ll> rasp(q);
	//for (auto i : diff) {
		//cout << i.first << " " << i.second << '\n';
	//}
	for (auto i : vp) {
		while (pdiff < n - 1 && diff[pdiff].first > i.first) {
			auto it = brk.lower_bound(diff[pdiff].second);
			auto high = *it;
			auto low = *(--it);
			//cout << "Break: " << diff[pdiff].second << '\n';
			ans -= calc(low + 1, high);
			ans += calc(low + 1, diff[pdiff].second);
			ans += calc(diff[pdiff].second + 1, high);
			brk.insert(diff[pdiff].second);
			pdiff ++;
		}
		while (pdiff2 < n - 2 && diff2[pdiff2].first > i.first) {
			auto it = brk.lower_bound(diff2[pdiff2].second);
			auto high = *it;
			auto low = *(--it);
			ans -= calc(low + 1, high);
			update(diff2[pdiff2].second);
			ans += calc(low + 1, high);
			pdiff2 ++;
		}
		//cout << "Answer: " << ans << '\n';
		rasp[i.second] = ans;
	}
	return rasp;
}


signed main() {
  signed _N;
  assert(1 == scanf("%d", &_N));
  std::vector<signed> W(_N), A(_N), B(_N);
  for (int i = 0; i < _N; i++)
    assert(3 == scanf("%d%d%d", &W[i], &A[i], &B[i]));
  signed Q;
  assert(1 == scanf("%d", &Q));
  std::vector<signed> E(Q);
  for (int j = 0; j < Q; j++)
    assert(1 == scanf("%d", &E[j]));
  fclose(stdin);

  std::vector<long long> R = calculate_costs(W, A, B, E);

  signed S = (signed)R.size();
  for (signed j = 0; j < S; j++)
    printf("%lld\n", R[j]);
  fclose(stdout);

  return 0;
}

Compilation message (stderr)

/usr/bin/ld: /tmp/ccTUUFWD.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccSauqPZ.o:nile.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status