昨晚ATG题求条
  • 板块学术版
  • 楼主zhangshirui
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/12/15 16:01
  • 上次更新2024/12/15 19:03:54
查看原帖
昨晚ATG题求条
1040353
zhangshirui楼主2024/12/15 16:01
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define lowbit(x) ((x)&-x)
class fenkuai{
	ll zhi[300005];
	public:
		fenkuai(){memset(zhi,0,sizeof(zhi));}
		void updata(int x,ll z){
			while(x<=300000){
				zhi[x]+=z;
				x+=lowbit(x);
			}
		}
		ll qer(int x){
			ll re=0;
			while(x){
				re+=zhi[x];
				x-=lowbit(x);
			}
			return re;
		}
		ll sum(int l,int r){
			return qer(r)-qer(l-1);
		}
}jsa,jsb,sma,smb; 
ll n,a[100005],b[100005],l[200005],k,ans[10005];
struct qs{
	int x,y,i;
	bool operator<(const qs& b)const{
		int x1=x/100,x2=b.x/100;
		if(x1==x2)return (x1&1?y>b.y:y<b.y);
		return x1<x2;
	}
}q[10005];
int find(ll x){
	return lower_bound(l,l+n*2,x)-l+1;
}
int main(){
	ios::sync_with_stdio(0);
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i],l[i-1]=a[i];
	for(int i=1;i<=n;i++)cin>>b[i],l[i-1+n]=b[i];
	sort(l,l+n*2);
	cin>>k;
	for(int i=1;i<=k;i++){
		cin>>q[i].x>>q[i].y;
		q[i].i=i;
	}
	int x=0,y=0;ll ans=0;
	sort(q+1,q+1+k);
	for(int i=1;i<=k;i++){
		while(x<q[i].x){
			x++;
			sma.updata(find(a[x]),a[x]);
			jsa.updata(find(a[x]),1);
			ans+=jsb.sum(1,find(a[x]))*a[x]-smb.sum(1,find(a[x]));
			ans+=smb.sum(find(a[x]),100000)-jsb.sum(find(a[x]),100000)*a[x];
		}
		while(x>q[i].x){
			sma.updata(find(a[x]),-a[x]);
			jsa.updata(find(a[x]),-1);
			ans-=jsb.sum(1,find(a[x]))*a[x]-smb.sum(1,find(a[x]));
			ans-=smb.sum(find(a[x]),100000)-jsb.sum(find(a[x]),100000)*a[x];
			x--;
		}
		while(y<q[i].y){
			y++;
			smb.updata(find(b[y]),b[y]);
			jsb.updata(find(b[y]),1);
			ans+=jsa.sum(1,find(b[y]))*b[y]-sma.sum(1,find(b[y]));//cerr<<ans;
			ans+=sma.sum(find(b[y]),100000)-jsa.sum(find(b[y]),100000)*b[y];
		}
		while(y>q[i].y){
			smb.updata(find(b[y]),-b[y]);
			jsb.updata(find(b[y]),-1);
			ans-=jsa.sum(1,find(b[y]))*b[y]-sma.sum(1,find(b[y]));
			ans-=sma.sum(find(b[y]),100000)-jsa.sum(find(b[y]),100000)*b[y];
			y--;
		}
		::ans[q[i].i]=ans;
	}
	for(int i=1;i<=k;i++)cout<<::ans[i]<<'\n';
}

2024/12/15 16:01
加载中...