이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
struct que{
int l, r, id;
};
void f(int l, int r, list<que>& v, long long a[], long long ans[], long long c[]){
if(l==r){
for(auto& i : v){
if(c[l] >= 0) ans[i.id] = 0;
else ans[i.id]=-1;
}
return;
}
int m = l+r>>1;
list<que> L, R, M;
for(const que& i : v){
if(i.r <= m) L.push_back(i);
else if(i.l > m) R.push_back(i);
else M.push_back(i);
}
v.clear();
f(l, m, L, a, ans, c);
f(m+1, r, R, a, ans, c);
long long S = 0;
vector<pair<long long, int>> p;
stack<pair<long long, int>> s;
long long fs[r-m], Fs[r-m];
for(int i = m+1;i <= r;i++){
if(i==m+1) Fs[i-m-1]=0;
else Fs[i-m-1] = Fs[i-m-2];
if(a[i] <= 0) {
S -= i*a[i];
long long k = -a[i];
while(!s.empty() && k){
if(k >= s.top().first) {
k -= s.top().first;
S -= s.top().first*s.top().second;
s.pop();
}
else {
S -= k*s.top().second;
s.top().first -= k;
k = 0;
break;
}
}
Fs[i-m-1] += k;
} else s.push({a[i], i});
fs[i-m-1] = S;
}
S = 0;long long g = 0;
int pt = m;
vector<array<long long, 3>> bs = {{0, 0, -1}};
for(auto& q : M){
while(pt > q.l){
if(a[pt] <= 0){
g -= a[pt];
S -= a[pt]*pt;
} else {
long long k = a[pt];
if(g >= k){
g -= k;
S -= k*pt;
pt--;
continue;
}
S -= g*pt;
k -= g;
g = 0;
bs.back()[2] = pt;
bs.push_back({bs.back()[0]+k, bs.back()[1]-k*pt, -1});
}
pt--;
}
long long k = c[pt];
if(g > k || k+bs.back()[0]-g < Fs[q.r-m-1]){
ans[q.id] = -1;
continue;
}
if(!Fs[q.r-m-1]){
ans[q.id] = S-g*pt+fs[q.r-m-1];
continue;
}
bs.back()[2] = pt;
int low = 0, high = bs.size()-1, best = 0;
while(low<=high){
int mid = low+high>>1;
if(bs[mid][0] >= Fs[q.r-m-1]) {
high=mid-1;
} else {
best = mid;
low = mid+1;
}
}
ans[q.id] = S-g*pt+fs[q.r-m-1]+bs[best][1]-(Fs[q.r-m-1]-bs[best][0])*bs[best][2];
}
}
void solve(){
int n, d;cin >> n >> d;
long long a[n+1], c[n+1];a[0]=0;
for(int i = 1;i <= n;i++) {
cin >> a[i];
c[i] = a[i];
}
for(int i = n;i >= 1;i--) {
a[i] = a[i]-a[i-1];
if(a[i] < 0){
a[i] = -a[i];
a[i] = (a[i]+d-1)/d;
a[i] = -a[i];
} else a[i] /= d;
if(c[i] < 0){
c[i] = -c[i];
c[i] = (c[i]+d-1)/d;
c[i] = -c[i];
} else c[i] /= d;
}
int q;cin >> q;
vector<que> qv;
for(int i = 0;i < q;i++){
int l, r;cin >> l >> r;
qv.push_back({l, r, i});
}
sort(qv.begin(), qv.end(), [](const auto& a, const auto& b){
return a.l > b.l;
});
long long ans[q];
list<que> lv(qv.begin(), qv.end());
f(1, n, lv, a, ans, c);
for(int i = 0;i < q;i++) cout << ans[i] << '\n';
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
solve();
}
컴파일 시 표준 에러 (stderr) 메시지
Main.cpp: In function 'void f(int, int, std::__cxx11::list<que>&, long long int*, long long int*, long long int*)':
Main.cpp:14:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
14 | int m = l+r>>1;
| ~^~
Main.cpp:87:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
87 | int mid = low+high>>1;
| ~~~^~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |