제출 #1234289

#제출 시각아이디문제언어결과실행 시간메모리
1234289lalig777나일강 (IOI24_nile)C++20
38 / 100
54 ms12104 KiB
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
//#define int long long
using namespace std;
typedef long long ll;

struct dades{
	ll ini;
	ll fin;
	ll mini;
	ll par;
};

vector<pair<ll, ll> >artifact;
vector<dades>blocs;

vector<ll> calculate_costs(vector<int> W, vector<int> A, vector<int> B, vector<int> E){
	int N=W.size();
	int Q=E.size();
	artifact.resize(N);
	blocs.resize(N);
	ll sum=0;
	for (int i=0; i<N; i++) sum+=A[i];
	for (int i=0; i<N; i++) artifact[i]=make_pair(W[i], A[i]-B[i]);
	sort(artifact.begin(), artifact.end());
	for (int i=0; i<N; i++){
		blocs[i].ini=i;
		blocs[i].fin=i;
		blocs[i].mini=artifact[i].second;
		blocs[i].par=1;
	}

	vector<pair<ll,ll> >consec(N-1);
	for (int i=0; i<N-1; i++) consec[i]=make_pair(artifact[i+1].first-artifact[i].first, i);
	sort(consec.begin(), consec.end());
	
	vector<pair<ll,ll> >queries(Q);
	vector<ll>resposta(Q);
	for (int i=0; i<Q; i++) queries[i]=make_pair(E[i], i);
	sort(queries.begin(), queries.end());
	
	int j=0; ll ans=0;
	for (int k=0; k<Q; k++){
		ll D=queries[k].first;
		while (j<N-1){

			if (consec[j].first>D) break;
			ll ind=consec[j].second;
			ll inici=blocs[ind].ini, final=blocs[ind+1].fin;
			ll minim=min(blocs[ind].mini, blocs[ind+1].mini), paritat=blocs[ind].par+blocs[ind+1].par;
			//cout<<ind<<' '<<inici<<' '<<final<<' '<<minim<<' '<<paritat<<endl;

			if (paritat==1 and blocs[ind].par==0) ans=ans-blocs[ind].mini+max(blocs[ind].mini, blocs[ind+1].mini);
			else if (paritat==1 and blocs[ind].par==1) ans=ans-blocs[ind+1].mini+max(blocs[ind].mini, blocs[ind+1].mini);
			else if (paritat==2) ans=ans+blocs[ind].mini+blocs[ind+1].mini;
			//cout<<ans<<endl;
			blocs[inici].ini=inici; blocs[inici].fin=final; blocs[inici].mini=minim; blocs[inici].par=paritat%2;
			blocs[final].ini=inici; blocs[final].fin=final; blocs[final].mini=minim; blocs[final].par=paritat%2;
			j++;
		}
		resposta[queries[k].second]=sum-ans;
	}
	//for (int i=0; i<Q; i++) cout<<resposta[i]<<' ';
	return resposta;
	
}
#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...