제출 #1333510

#제출 시각아이디문제언어결과실행 시간메모리
1333510PlayVoltz나일강 (IOI24_nile)C++20
67 / 100
2090 ms8560 KiB
#include "nile.h"
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second
#define pb push_back

vector<int> calculate_costs(vector<signed> w, vector<signed> a, vector<signed> b, vector<signed> e){
	vector<int> ans(e.size());
	vector<pair<int, pii> > vect(w.size());
	for (int i=0; i<w.size(); ++i)vect[i]=mp(w[i], mp(a[i], b[i]));
	sort(vect.begin(), vect.end());
	for (int tc=0; tc<e.size(); ++tc){
		int d=e[tc];
		vector<pii> ord;
		int l=0, r=0;
		for (int i=1; i<vect.size(); ++i){
			if (vect[i].fi-vect[i-1].fi<=d)++r;
			else ord.pb(mp(l, r)), l=r=i;
		}
		ord.pb(mp(l, r));
		int res=0;
		for (auto c:ord){
			for (int i=c.fi; i<=c.se; ++i)res+=vect[i].se.se;
			if (c.se%2!=c.fi%2)continue;
			int mn=LLONG_MAX/2;
			for (int i=c.fi+2; i<=c.se; ++i)if (vect[i].fi-vect[i-2].fi<=d)mn=min(mn, vect[i-1].se.fi-vect[i-1].se.se);
			for (int i=c.fi; i<=c.se; i+=2)mn=min(mn, vect[i].se.fi-vect[i].se.se);
			//case where i take odd index so split even, 1, even
			//case where i take even index so split odd, 1, odd maybe irrelevant?
			//case where i can take one thing for free
			res+=mn;
		}
		ans[tc]=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...