chenfy27的刷题记录

导航

abc367F 判断区间构成的多重集合是否相同

给定长度为N的两个数组A[i]和B[i],有Q组询问,每次给定(l[i],r[i],L[i],R[i]),问由A[l[i]]A[r[i]]构成的multiset,与B[L[i]]B[R[i]]构成的multiset是否相同?

范围:1<=N,Q<=2E5, 1<=A[i],B[i]<=N, 1<=l[i]<=r[i]<=N, 1<=L[i]<=R[i]<=N

分析:将int映射为u64,因为集合不区分先后,而加法满足交换律,因此用加法来做哈希,又因为是多重集合,相同元素要叠加。

#include <bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;

// hval模板...

void solve() {
	int N, Q;
	std::cin >> N >> Q;
	std::vector<int> A(N+1), B(N+1);
	for (int i = 1; i <= N; i++) {
		std::cin >> A[i];
	}
	for (int i = 1; i <= N; i++) {
		std::cin >> B[i];
	}

	std::vector<hval> HA(N+1), HB(N+1);
	for (int i = 1; i <= N; i++) {
		HA[i].set(A[i]);
		HB[i].set(B[i]);
	}
	std::partial_sum(HA.begin(), HA.end(), HA.begin());
	std::partial_sum(HB.begin(), HB.end(), HB.begin());

	for (int i = 1; i <= Q; i++) {
		int l, r, L, R;
		std::cin >> l >> r >> L >> R;
		if (HA[r] - HA[l-1] == HB[R] - HB[L-1]) {
			std::cout << "Yes\n";
		} else {
			std::cout << "No\n";
		}
	}
}

int main() {
	std::cin.tie(0)->sync_with_stdio(0);
	int t = 1;
	while (t--) solve();
	return 0;
}

posted on 2024-09-22 21:46  chenfy27  阅读(16)  评论(0编辑  收藏  举报