一个简单的询问 HYSBZ - 5016

https://blog.csdn.net/weixin_30337251/article/details/99742674 参考文章

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define N 50005
using namespace std;
struct node {
	int l, r, id, belong, k;
} q[N << 2];
int Dl[N], Dr[N], a[N];
ll res, ans[N];
int n, m, tot, belong;
bool cmp(node A, node B) {
	if(A.belong == B.belong)
		return A.r < B.r;
	return A.belong < B.belong;
}
void AddL(int x) {
	res += Dr[a[x]];
	++ Dl[a[x]];
}
void AddR(int x) {
	res += Dl[a[x]];
	++ Dr[a[x]];
}
void DecL(int x) {
	res -= Dr[a[x]];
	-- Dl[a[x]];
}
void DecR(int x) {
	res -= Dl[a[x]];
	-- Dr[a[x]];
}
int main() {
	cin>>n;
	belong = sqrt(n);
	for (int i = 1; i <= n; i ++)
		cin>>a[i];
	cin>>m;
	tot = 0;
	for (int i = 1; i <= m; i ++) {
		int l1, r1, l2, r2;
		cin>>l1>>r1>>l2>>r2;
		q[++ tot] = {l1 - 1, l2 - 1, i, (l1 - 2) / belong + 1, 1};
		q[++ tot] = {r1, r2, i, (r1 - 1) / belong + 1, 1};
		q[++ tot] = {l1 - 1, r2, i, (l1 - 2) / belong + 1, -1};
		q[++ tot] = {r1, l2 - 1, i, (r1 - 1) / belong + 1, -1};
	}
	sort(q + 1, q + 1 + tot, cmp);
	int l = 0, r = 0;
	for (int i = 1; i <= tot; i ++) {
		while (r < q[i].r)
			AddR(++ r);
		while (l > q[i].l)
			DecL(l --);
		while (r > q[i].r)
			DecR(r --);
		while (l < q[i].l)
			AddL(++ l);
		ans[q[i].id] += q[i].k * res;
	}
	for (int i = 1; i <= m; i ++)
		cout<<ans[i]<<endl;
	return 0;
}
posted @   晴屿  阅读(78)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
点击右上角即可分享
微信分享提示