제출 #1334957

#제출 시각아이디문제언어결과실행 시간메모리
1334957NAMINFish 3 (JOI24_fish3)C++20
100 / 100
199 ms37160 KiB
#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;

ll D;
ll N,Q;
vector<ll> a;


struct Elem{
	ll mn,preflcost,idx;
};

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> N >> D;
	a.resize(N+1);
	a[0]=0;
	for(int i=1;i<=N;i++){
		cin >> a[i];
	}
	cin >> Q;
	vector<ll> ans(Q);
	vector<vector<pair<ll,ll>>> querys(N+1);//L,idx_ans
	for(int i=0;i<Q;i++){
		int l,r;
		cin >> l >> r;
		querys[r].push_back(make_pair(l,i));
	}
	
	vector<ll> c(N+1,0);
	c[N]=a[N];
	for(int i=N-1;i>=1;i--){
		if(a[i]<=a[i+1]){
			c[i]=c[i+1]-(a[i+1]-a[i])/D;
		}
		else{
			c[i]=c[i+1]+(a[i]-a[i+1]+D-1)/D;
		}
	}
	vector<ll> pref(N+1,0);
	for(int i=1;i<=N;i++){
		pref[i]=pref[i-1]+c[i];
	}

	vector<Elem> st{{0,0,0}};
	for(int i=1;i<=N;i++){
		while(st.size()>0&&st.back().mn>c[i]){
			st.pop_back();
		}
		ll prefantcost=st.back().preflcost;
		ll len = i-st.back().idx;
		ll prefrcost= prefantcost + 1LL*len*c[i];
		st.push_back({c[i],prefrcost,i});
		
		for(auto [L,idx_ans] : querys[i]){
			Elem elemleft={-1,-1,-1};
			int lo=0,hi=st.size()-1;
			while(lo<=hi){
				int mid = lo+(hi-lo)/2;
				if(st[mid].idx>=L){
					elemleft=st[mid];
					hi=mid-1;
				}
				else{
					lo=mid+1;
				}
			}
			assert(elemleft.idx!=-1);//trouvé !
			if(a[L]-(c[L]-elemleft.mn)*D<0){
				ans[idx_ans]=-1;
				continue;
			}
			ans[idx_ans]=(pref[i]-pref[L-1])
				-(1LL*(elemleft.idx-L+1)*elemleft.mn + prefrcost - elemleft.preflcost);
		}
	}
	
	for(int i=0;i<Q;i++){
		cout << ans[i] << endl;
	}
}


#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...