제출 #1244656

#제출 시각아이디문제언어결과실행 시간메모리
1244656allin27x나일강 (IOI24_nile)C++20
100 / 100
177 ms26932 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

struct _obj {
	int a, b, w;
};

struct rg {
	int l , r, sum, mn0, mn1, ans;
};

struct _lnk {
	int df;
	int idx; //with idx+1
};

bool comp1(_obj a, _obj b) {
	return a.w < b.w;
}
bool comp2(_lnk a, _lnk b) {
	return a.df < b.df;
}

int res = 0;
const int N = 1e5+5;
const int INF = 1e18;
rg Z[N];

set<int> lfs,rgs;
void join(int i) {
	rg R; R.l = Z[i].l; R.r = Z[i+1].r;
	R.sum = Z[i].sum + Z[i+1].sum; res -= Z[i].ans; res -= Z[i+1].ans;
	if ((Z[i].r - Z[i].l + 1)&1) swap(Z[i+1].mn0, Z[i+1].mn1);
	R.mn0 = min(Z[i].mn0, Z[i+1].mn0); R.mn1 = min(Z[i].mn1, Z[i+1].mn1);
	if ((R.r - R.l)&1) R.ans = R.sum; else R.ans = R.sum + R.mn0;
	res += R.ans;
	rgs.erase(i); lfs.erase(i+1);
	Z[R.l] = R; Z[R.r] = R;
}

void upd(int i, int nv) {
	int r = *rgs.lower_bound(i);
	rg R = Z[r]; res -= R.ans;
	R.mn0 = min(R.mn0, nv); R.mn1 = min(R.mn1, nv);
	if ((R.r - R.l)&1) R.ans = R.sum; else R.ans = R.sum + R.mn0;
	res += R.ans;
	Z[R.l] = R; Z[R.r] = R;
}

vector<long long> calculate_costs(vector<signed> W, vector<signed> A, vector<signed> B, vector<signed> E) {
	int n = W.size();
	vector<_obj> p(n); for (int i=0; i<n; i++) p[i].a = A[i], p[i].b = B[i], p[i].w = W[i];
	sort(p.begin(), p.end(), comp1);
	vector<_lnk> evs;
	for (int i=0; i<n-1; i++) {
		_lnk t; t.df = p[i+1].w - p[i].w; t. idx = i;
		evs.push_back(t);
	}
	sort(evs.begin(), evs.end(), comp2);
	vector<pair<int,int>> qs;
	vector<int> ans((int)E.size());
	for (int i=0; i<E.size(); i++) qs.push_back({E[i], i});
	sort(qs.begin(), qs.end());
	for (int i=0; i<n; i++) {
		lfs.insert(i); rgs.insert(i);
		Z[i].l = i; Z[i].r = i; Z[i].sum = p[i].b;
		Z[i].mn0 = p[i].a-p[i].b; Z[i].ans = p[i].a; Z[i].mn1 = INF;
		res += p[i].a;
	}
	vector<_lnk> ps2;
	for (int i=1; i<n-1; i++) {
		_lnk t; t.df = p[i+1].w - p[i-1].w; t.idx = i;
		ps2.push_back(t);
	}
	sort(ps2.begin(), ps2.end(), comp2);
	int j=0; int t = 0;
	for (auto [d, idx]: qs) {
		while (j<evs.size() && evs[j].df <= d) {
			join(evs[j].idx); j++;
		}
		while (t<ps2.size() && ps2[t].df <= d) {
			int i = ps2[t].idx;
			upd(i, p[i].a - p[i].b);
			t++;
		}
		ans[idx] = res;

	}
	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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...