给定 L , R , l , r
规定a在 [L,R] 内等概率出生,b在 [ l , r ] 内等概率生成
求a%b的期望(1<=L , R , l , r <=1e18)
由于我不会,所以数据范围瞎定的


啥意思,我树状数组+二分双 log 做法比大多数线段树单 log 做法跑的还快?
码扔这了
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+9;
int n,q,pos[maxn],tree[maxn],ans[maxn];
vector<pair<int,int>> v[maxn];
void update(int x){for(;x<=n;x+=-x&x) tree[x]++;}
int query(int x){
int res=0;
for(;x;x-=-x&x) res+=tree[x];
return res;
}
int lowb(int rnk){
int l=1,r=n;
while(l<r){
int mid=(l+r)>>1;
if(query(mid)>=rnk) r=mid;
else l=mid+1;
}
return r;
}
int main(){
freopen("bubble.in","r",stdin);
freopen("bubble.out","w",stdout);
scanf("%d",&n);
for(int i=1,x;i<=n;i++) scanf("%d",&x),pos[x]=i;
scanf("%d",&q);
for(int i=1,k,x;i<=q;i++) scanf("%d%d",&k,&x),v[x].push_back(make_pair(k,i));
for(int i=n;i;i--){
for(auto pr:v[i]){
if(pr.first>n-i) ans[pr.second]=i;
else ans[pr.second]=max(lowb(pr.first),pos[i])-pr.first;
}
update(pos[i]);
}
for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
return 0;
}
浙公网安备 33010602011771号