首页 > 其他分享 >abc367F 判断区间构成的多重集合是否相同

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

时间:2024-09-22 21:47:18浏览次数:8  
标签:多重 h2 hval h1 u64 abc367F int h3 集合

给定长度为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,因为集合不区分先后,而加法满足交换律,因此用加法来做哈希,又因为是多重集合,相同元素要叠加。为了减少冲突,这里用了3重哈希。

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

struct hval {
	u64 h1, h2, h3;
	u64 f1(u64 x) { return 19260817 + 1237123ULL * x * x * x; }
	u64 f2(u64 x) { return 71806291 + 3217321ULL * x * x; }
	u64 f3(u64 x) { return 74328249 + 1678931ULL * x; }
	void set(int x) {
		h1 = f1(x & 0x7fffffff) + f1(x >> 31);
		h2 = f2(x & 0x07ffffff) + f2(x >> 27);
		h3 = f3(x & 0x00007fff) + f3(x >> 15);
	}
	hval(u64 a=0, u64 b=0, u64 c=0):h1(a), h2(b), h3(c) {}
	bool operator==(const hval &rhs) const {
		return h1 == rhs.h1 && h2 == rhs.h2 && h3 == rhs.h3;
	}
	friend hval operator+(const hval &a, const hval &b) {
		return hval(a.h1 + b.h1, a.h2 + b.h2, a.h3 + b.h3);
	}
	friend hval operator-(const hval &a, const hval &b) {
		return hval(a.h1 - b.h1, a.h2 - b.h2, a.h3 - b.h3);
	}
};

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;
}

标签:多重,h2,hval,h1,u64,abc367F,int,h3,集合
From: https://www.cnblogs.com/chenfy27/p/18425954

相关文章

  • 论 JAVA 集合框架中 接口与类的关系
    前言这是笔者在学习过程中的一篇"备忘录",其目的是能用最EZ最粗鄙的语言口述出JAVA集合框架中所有类与接口的关系本人在不断地学习中,总会混淆集合框架中的类和接口,以及它们的作用关系,虽然不影响我的使用,但是我也不想一直糊涂下去,故而趁知识还没混淆之际,赶紧写下来.......
  • 利用 JavaScript 的集合和映射实现高效的内容管理系统
    javascript提供了几种强大的数据结构来处理数据集合。其中,map和set对于某些类型的任务特别有用。在本博客中,我们将探讨使用map和set解决常见编程问题的现实示例。理解地图和集合在深入示例之前,让我们快速回顾一下javascript中的map和set是什么。地图map是键值对......
  • 国内外ChatGPT网站集合,无限制使用【2024-09最新】~
    经过我一年多以来,使用各种AI工具的体验,我收集了一批AI工具和站点这些工具都是使用的最强最主流的模型,也都在各个领域里都独领风骚的产品。而且,这些工具你都可以无限制地使用。无论你是打工人、科研工作者、学生、文案写作,我相信这些工具一定能在很大程度上帮到你~1:【AI站点......
  • JAVA集合——Collection接口
    目录1.Collection接口1.概述2.常见方法a.对象添加到集合中b.清空集合中所有的元素c.把给定的对象在当前集合中删除d.判断是否包含 e.判断集合是否为空f.返回集合元素中集合个数​编辑3.Collection的遍历方式a.迭代器遍历1.获取迭代器2.迭代器中常见的方法a.......
  • 速通JAVA集合
     0.常见的时间复杂度以及性能从好到坏的排序:O(1),O(logn),O(n),O(nlogn),O(n^2) List相关问题1.为什么数组的索引是从0开始的,而不是从1开始的呢?首先数组是一个空间连续存储同种类型元素的有序集合。如果索引从0开始,那么寻址就是a[i]=baseAddress+i*dataTypeSize。如......
  • 集合是什么
    1.是什么        集合(Collection)是Java语言中一个非常重要的概念,它是一组对象的容器,用于存储、检索和操作对象。在Java中,集合框架定义了一系列接口和实现类,用于处理不同类型的集合。集合的概念集合框架提供了两种类型的集合:List:存储有序的元素集合,允许重复元素。S......
  • 集合框架底层使用了什么数据结构
    1.是什么        集合框架(CollectionFramework)是Java标准库的一部分,它提供了一系列接口和实现类,用于处理不同类型的集合。这些集合可以用于存储和操作对象,如列表、集合、映射等。集合框架的底层数据结构是多种多样的,具体取决于集合实现类的选择。1.List(列表)Array......
  • 7. 在Java中集合mysql如何执行一条简单的SELECT查询,并获取结果集?
    在Java中,使用JDBC(JavaDatabaseConnectivity)可以执行SQL查询,并获取结果集(ResultSet)。以下是执行一条简单的SELECT查询,并获取和处理结果集的详细步骤:1.导入必要的包首先,确保导入了必要的JDBC包。你需要导入以下包来进行数据库连接和操作:importjava.sql.Connection;imp......
  • 章14——集合——集合体系
    目录两个难点底层机制,和不同应用场景下的选择集合体系图,需要背诵!总结:1、集合主要是两组(单列集合、双列集合)2、Collection接口有两个重要的子接口ListSet,他们的实现子列都是单列集合3、Map接口实现的子类是双列集合,存放的是key,value4、上述两张图要记清楚......
  • Python量化分析2024年最新整理的免费获取股票数据接口集合以及API数据接口说明文档
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......