老是 RE 4个点,这是 提交记录 。
思路就是暴力莫队,检查了一下不是树状数组的问题,但是就是那 4 个点有问题求解释。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
struct Point{
int l,r,id;
}wt[N];
int n,a[N],q,b[N],len,c[N],sum[N],d[N],f[N],ans,ans1[N];
struct tree{
int c[N];
int query(int x){int ans=0;
for(;x;x-=x&(-x))ans+=c[x];return ans;
}
void add(int x,int y){
for(;x<=len;x+=x&(-x))c[x]+=y;
}
}f1,f2,f3,f4;
int fk;
bool cmp(Point x,Point y){
if(x.l/fk==y.l/fk)return x.r<y.r;
return x.l<y.l;
}
void movel(int x,int val){
if(!x)cout <<"利群";
ans+=val*(f1.query(x)*c[x]-f2.query(x)+(f2.query(len)-f2.query(x))-(f1.query(len)-f1.query(x))*c[x]);
f3.add(x,val);f4.add(x,c[x]*val);
}
void mover(int x,int val){
if(!x)cout << "利群"
ans+=val*(f3.query(x)*c[x]-f4.query(x)+(f4.query(len)-f4.query(x))-(f3.query(len)-f3.query(x))*c[x]);
f1.add(x,val),f2.add(x,c[x]*val);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n;
for(int i = 1;i <= n;i++)cin >> a[i],c[++len]=a[i];
for(int i = 1;i <= n;i++)cin >> b[i],c[++len]=b[i];
sort(c+1,c+1+len);
len=unique(c+1,c+1+len)-c-1;
for(int i = 1;i <= n;i++){
a[i]=lower_bound(c+1,c+1+len,a[i])-c;
b[i]=lower_bound(c+1,c+1+len,b[i])-c;
}cin >> q;fk=n/sqrt(q);
for(int i = 1;i <= q;i++){
cin >> wt[i].l >> wt[i].r;
wt[i].id=i;
}sort(wt+1,wt+1+q,cmp);
int l = 0,r=0;
for(int i = 1;i <= q;i++){
// cout << "work" << i <<" " << l <<" " <<r <<"\n";
for(;l<wt[i].l;)movel(a[++l],1);
// cout << ans << "\n";
for(;l>wt[i].l;)movel(a[l--],-1);
//cout << ans << "\n";
for(;r<wt[i].r;)mover(b[++r],1);
// cout << ans << "\n";
for(;r>wt[i].r;)mover(b[r--],-1);
ans1[wt[i].id]=ans;//cout << ans << "\n";
}for(int i= 1;i <= q;i++)cout << ans1[i] << "\n";
return 0;
}