莫队为什么T飞20pts了
查看原帖
莫队为什么T飞20pts了
743373
Vitamin_B楼主2024/8/22 22:35

rt

//# pragma GCC optimize("Ofast,no-stack-protector")
//
//# pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

# include <bits/stdc++.h>

# define I return

# define AK 0

# define IOI ;

using namespace std;

typedef long long ll;

typedef pair <int, int> pii;

int n, m, t, len, a[50005], pie[50005], s1[50005], s2[50005];

ll sum, ans[50005];

struct node {

	int x, y, id, op;

	bool operator < (const node& a) const {

		return pie[x] != pie[a.x] ? pie[x] < pie[a.x] : pie[x] & 1 ? y > a.y : y < a.y;

	}

} q[200005];

void add1 (const int x) {

	sum += s2[a[x]];

	++ s1[a[x]];

	return ;

}

void del1 (const int x) {

	sum -= s2[a[x]];

	-- s1[a[x]];

	return ;

}

void add2 (const int x) {

	sum += s1[a[x]];

	++ s2[a[x]];

	return ;

}

void del2 (const int x) {

	sum -= s1[a[x]];

	-- s2[a[x]];

	return ;

}

int main () {

	ios::sync_with_stdio (0);

	cin.tie (0);

	cout.tie (0);

	cin >> n;

	len = n / sqrt (m);

	for (int i = 1; i <= n; ++ i)
		cin >> a[i], pie[i] = i / len;

	cin >> m;

	for (int i = 0, l1, l2, r1, r2; i < m; ++ i) {

		cin >> l1 >> r1 >> l2 >> r2;

		q[++ t] = {r1, r2, i, 1};

		q[++ t] = {l1 - 1, r2, i, -1};

		q[++ t] = {r1, l2 - 1, i, -1};

		q[++ t] = {l1 - 1, l2 - 1, i, 1};

	}

	sort (q + 1, q + 1 + t);
//	q[t = 1] = {2, 2, 0, 1};
	for (int i = 1, x = 0, y = 0; i <= t; ++ i) {

		while (x < q[i].x)
			add1 (++ x);

		while (y < q[i].y)
			add2 (++ y);

		while (x > q[i].x)
			del1 (x --);

		while (y > q[i].y)
			del2 (y --);
//		cerr << x << ',' << y << ':' << sum << '\n';
		ans[q[i].id] += q[i].op * sum;

	}

	for (int i = 0; i < m; ++ i)
		cout << ans[i] << '\n';

	I AK IOI

}
2024/8/22 22:35
加载中...