Submission #1197801

#TimeUsernameProblemLanguageResultExecution timeMemory
1197801ansori나일강 (IOI24_nile)C++20
100 / 100
437 ms37808 KiB
#include "nile.h"
#include<bits/stdc++.h>
#define ll long long
#define fi first 
#define se second
using namespace std;
const int inf = 1e9 , N = 1e5 + 5;
vector<ll> sb(N);
ll sans;
int s;
vector<vector<int>> t(N * 4 , vector<int> (4 , inf));
vector<int> kur;
set<pair<int , pair<int , ll>>> st;
vector<int> mrg(vector<int> a, vector<int> b){
	return {min(a[0] , b[0]) , min(a[1] , b[1]) , min(a[2] , b[2]) , min(a[3] , b[3])};
}
void update(int v , int l , int r , int j , int x , int tp){
	if(r - l == 1){
		if(tp == 1) t[v][l % 2] = x;
		else t[v][l % 2 + 2] = x;
	}
	else{
		int m = (l + r) / 2;
		if(j < m) update(v * 2 , l , m , j , x , tp);
		else update(v * 2 + 1 , m , r , j , x , tp);
		t[v] = mrg(t[v * 2] , t[v * 2 + 1]);
	}
}
void gett(int v , int l , int r , int l1 , int r1){
	if(l <= l1 and r >= r1){
		kur = mrg(kur , t[v]);
	}
	else{
        int m = (l1 + r1) / 2;
        if(!(l1 >= r || m <= l)) {
            gett(v * 2 , l , r , l1 , m);
        }
        if(!(m >= r || r1 <= l)) {
            gett(v * 2 + 1 , l , r , m , r1);
        }
	}
}
vector<int> get(int l , int r){
	kur = {inf , inf , inf , inf};
	gett(1 , l , r + 1 , 0 , s);
	return kur;
}
void updt(int j , int x , int tp){
	update(1 , 0 , s , j , x , tp);
}
void upd(int p){
	auto to = (-- st.lower_bound({p + 1 , {-1 , -1}}));
	int l = to -> fi;
	int r = (to -> se).fi;
	ll sm = (to -> se).se;
	ll ons = sb[r];
	if(l) ons -= sb[l - 1];
	sans -= sm;
	if((r - l + 1) % 2 == 1){
		vector<int> ff = get(l , r);
		//cout << l << ' ' << r << ' ' << ff[2 + ((l + 1) % 2)] << ' ';
		ons += min(ff[l % 2] , ff[2 + ((l + 1) % 2)]);
	}
	st.erase(to);
	st.insert({l , {r , ons}});
	sans += (to -> se).se;	
}
void unit(int p){
	auto to = (st.lower_bound({p + 1 , {-1 , -1}}));
	int l1 = p + 1;
	int r1 = (to -> se).fi;
	ll sm1 = (to -> se).se;
	to --;
	int l0 = to -> fi;
	int r0 = p;
	ll sm0 = (to -> se).se;
	st.erase({l1 , {r1 , sm1}});
	st.erase({l0 , {r0 , sm0}});
	sans -= (sm1 + sm0);
	st.insert({l0 , {r1 , 0}});
	upd(l0);
}
std::vector<long long> calculate_costs(std::vector<int> w, std::vector<int> a, std::vector<int> b, std::vector<int> e) {
	int q = e.size();
	int n = w.size();
	s = 1;
	while(s < n) s *= 2;
	vector<pair<int , int>> p(n);
	for(int i = 0;i < n; ++ i) p[i] = {w[i] , i};
	sort(p.begin() , p.end());
	vector<pair<int , pair<int , int>>> ivent;
	// time , type ivent , position
	for(int i = 1;i < n; ++ i){
		ivent.push_back({p[i].fi - p[i - 1].fi , {1 , i - 1}});
		if(i > 1) ivent.push_back({p[i].fi - p[i - 2].fi , {2 , i - 1}});
	}
	vector<ll> ans(q);
	for(int i = 0;i < q; ++ i) ivent.push_back({e[i] , {3 , i}});
	sort(ivent.begin() , ivent.end());
	sb[0] = b[p[0].se];
	for(int i = 0;i < n; ++ i){
		sans += a[i];
		st.insert({i , {i , a[p[i].se]}});
		if(i) sb[i] = sb[i - 1] + b[p[i].se];
		updt(i , a[p[i].se] - b[p[i].se] , 1);
	}
	for(auto to : ivent){
		int dst = to.fi , t = to.se.fi , pos = to.se.se;
		if(t == 3) ans[pos] = sans;
		else if(t == 1){
			unit(pos);
		}
		else{
			updt(pos , a[p[pos].se] - b[p[pos].se] , 2);
			upd(pos);
		}
		//cout << dst << ' ' << t << ' ' << pos << ' ' << sans << '\n';
	}
	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...