이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
const int MAXN=400001;
using ll = long long ;
int n;
int c[MAXN];
int q;
int qL[MAXN], qR[MAXN];
int qans[MAXN];
void solve(int L, int R, vector<int>& qs) {
//~ cerr<<L<<" "<<R<<"\n"<<flush;
if(L==R) {
for(auto i:qs) {
qans[i]=c[qL[i]]==0;
}
return ;
}
if(qs.empty()) return ;
int mid=(L+R)/2;
vector<int> ans(R-L+2), where(R-L+2);
vector<ll> pref(R-L+2);
for(int i=L;i<=R;++i) {
pref[i-L+1]=pref[i-L]+c[i];
}
map<ll,int> last;
auto handle=[&](int i, bool left) {
#define chkmx(ind, val, ww) if(ans[ind]<val || (ans[ind]==val && abs(mid-ww)>abs(mid-where[ind]))) {ans[ind]=val;where[ind]=ww;}
int ind=i-(L-1);
ans[ind]=0;
where[ind]=i;
if(left && i+1<=mid) {
chkmx(ind, ans[ind+1], where[ind+1]);
}
if(!left && i-1>=mid+1) {
chkmx(ind, ans[ind-1], where[ind-1]);
}
ll curr_pref=pref[ind];
if(last.count(curr_pref)) {
int w=last[curr_pref];
chkmx(ind, (1+ans[w]), where[w]);
}
last[curr_pref]=ind;
};
for(int i=mid;i>=L-1;i--) {
handle(i, true);
}
last.clear();
for(int i=mid+1;i<=R;i++) {
handle(i, false);
}
last.clear();
for(int i=L-1;i<=mid;++i) {
last[pref[i-(L-1)]]=i;
}
vector<int> best(R-(mid+1)+1);
for(int i=mid+1;i<=R;++i) {
int ind=i-(mid+1);
best[ind]=-1;
ll curr_pref=pref[i-(L-1)];
if(last.count(curr_pref)) {
best[ind]=last[curr_pref];
}
if(ind>0) best[ind]=max(best[ind], best[ind-1]);
}
vector<int> bal, jobb;
for(int i:qs) {
if(qL[i]<=mid && mid+1<=qR[i]) {
qans[i]=ans[qL[i]-1-(L-1)]+ans[qR[i]-(L-1)];
int leftStop=where[qL[i]-1-(L-1)], rightStart=where[qR[i]-(L-1)];
if(leftStop<=best[rightStart-(mid+1)]) qans[i]++;
}else if(qR[i]<=mid) {
bal.push_back(i);
}else {
jobb.push_back(i);
}
}
if(L<R) {
solve(L, mid, bal);
solve(mid+1, R, jobb);
}
//~ for(auto i:pref) cerr<<i<<" ";cerr<<"\n";
//~ for(auto i:ans) cerr<<i<<" ";cerr<<"\n";
//~ for(auto i:where) cerr<<i<<" ";cerr<<"\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;++i) cin>>c[i];
cin>>q;
for(int i=0;i<q;++i) cin>>qL[i]>>qR[i];
vector<int> qs;
for(int i=0;i<q;++i) {
qs.push_back(i);
qans[i]=0;
}
solve(1, n, qs);
for(int i=0;i<q;++i) cout<<qans[i]<<"\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |