不过样例全部输出0求条!
查看原帖
不过样例全部输出0求条!
1100403
xuyunao楼主2024/12/18 15:48
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e6+10;
int a[maxn],b[maxn],vala[maxn],valb[maxn];
int l[maxn];
int size,n;
int cnt = 0;
struct note{
	int x,y,id; 
}q[maxn];

bool cmp(note a,note b)
{
	if((a.x - 1) / size + 1 == (b.x - 1) / size + 1) return a.y < b.y;
	return (a.x - 1) / size + 1 < (b.x - 1) / size + 1;
}

struct BIT{
	int c[maxn];
	void insert(int x,int k)
	{
		for(;x <= cnt;x += (x & (-x)))
		{
			c[x] += k;
		}
	}
	int cha(int x)
	{
		int sum = 0;
		for(;x;x -= (x & (-x)));
		{
			sum += c[x];
		}
		return sum;
	}
	int query(int l,int r)
	{
		return cha(r) - cha(l - 1);
	}
}aa,cnta,bb,cntb;

int ans[maxn];
int res = 0;

void changex(int val,int fh)
{
//	cout << "a:" << val << " b:" << fh << endl;
//	cout << cntb.query(1,a[val]) << " " << vala[val] << " " << bb.query(1,a[val]) << endl;
	res += fh * (cntb.query(1,a[val]) * vala[val] - bb.query(1,a[val]));
	res += fh * (bb.query(a[val] + 1,cnt) - cntb.query(a[val] + 1,cnt) * vala[val]);
	aa.insert(a[val],fh * vala[val]);
//	cout << "1111111ffccf" << endl;
	cnta.insert(a[val],fh);
//	cout << "res = " << res << endl;
}

void changey(int val,int fh)
{
	res += fh * (cnta.query(1,b[val]) * valb[val] - aa.query(1,b[val]));
	res += fh * (aa.query(b[val] + 1,cnt) - cnta.query(b[val] + 1,cnt) * valb[val]);
	bb.insert(b[val],fh * valb[val]);
	cntb.insert(b[val],fh);
}

signed main()
{
	cin >> n;
	size = sqrt(n);
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i];
		vala[i] = a[i];
		l[++cnt] = a[i];
	}
	for(int i = 1;i <= n;i++)
	{
		cin >> b[i];
		valb[i] = b[i];
		l[++cnt] = b[i];
	}
	sort(l + 1,l + cnt + 1);
	cnt = unique(l + 1,l + cnt + 1) - l - 1; 
	for(int i = 1;i <= n;i++)
	{
		a[i] = lower_bound(l + 1,l + cnt + 1,a[i]) - l;
		b[i] = lower_bound(l + 1,l + cnt + 1,b[i]) - l;
	}
	
	int k;
	cin >> k;
	for(int i = 1;i <= k;i++)
	{
		cin >> q[i].x >> q[i].y;
		q[i].id = i;
	}
	sort(q + 1,q + k + 1,cmp);
	
//	for(int i = 1;i <= k;i++)
//	{
//		cout << q[i].id << " ";
//	}
//	cout << endl;
	int x = 0,y = 0;
	for(int i = 1;i <= k;i++)
	{
		while(x > q[i].x) changex(x--,-1);
		while(y > q[i].y) changey(y--,-1);
		while(x < q[i].x) changex(++x,1);
		while(y < q[i].y) changey(++y,1);
		ans[q[i].id] = res;
	}
	for(int i = 1;i <= k;i++)
	{
		cout << ans[i] << endl;
	} 
	return 0;
}
2024/12/18 15:48
加载中...