P5459 [BJOI2016] 回转寿司
P5459 [BJOI2016] 回转寿司
https://www.luogu.com.cn/problem/P5459
https://www.luogu.com.cn/article/nnyrsj3m
空间,由于单点修改操作至多涉及 \(\lceil\log val\rceil\) 个区间,区间查询涉及 \(\lceil4\log val\rceil\),所以需要 \(5n\log val\),考虑到 \(\max\sum a=10^{10}\),理论上最坏要开到 \(1.7\times 10^7\),190几MB,不会超;但是远远不及,开到 \(6\times 10^6\) 可过。
#include<iostream>
using namespace std;
typedef long long ll;
const int N=100010,M=6e6;
const ll INF=1e10;
bool _u;
int n,L,R,v[M],rt,l[M],r[M],idx;
ll ans,a[N];
bool _v;
void pushup(int p){
v[p]=v[l[p]]+v[r[p]];
}
int query(int &p,ll ql,ll qr,ll L=-INF,ll R=INF){
if(!p)p=++idx;
if(ql<=L&&R<=qr)return v[p];
ll mid=L+R>>1,res=0;
if(ql<=mid)res=query(l[p],ql,qr,L,mid);
if(qr>mid)res+=query(r[p],ql,qr,mid+1,R);
return res;
}
void modify(int &p,ll x,ll L=-INF,ll R=INF){
if(!p)p=++idx;
if(L==R){
++v[p];
return;
}
ll mid=L+R>>1;
if(x<=mid)modify(l[p],x,L,mid);
else modify(r[p],x,mid+1,R);
pushup(p);
}
int main(){
#ifdef LOCAL
freopen("1.txt","r",stdin);
#endif
#ifndef LOCAL
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
#endif
cerr<<(&_v-&_u)/1024.0/1024.0<<'\n';
cin>>n>>L>>R;
for(int i=1;i<=n;++i){
int x;
cin>>x;
a[i]=a[i-1]+x;
}
modify(rt,0);
for(int i=1;i<=n;++i){
ans+=query(rt,a[i]-R,a[i]-L);
modify(rt,a[i]);
}
cout<<ans;
return 0;
}