首页 > 其他分享 >关于此题[ABC367F] Rearrange Query随机化哈希的一些总结

关于此题[ABC367F] Rearrange Query随机化哈希的一些总结

时间:2025-01-10 22:10:27浏览次数:1  
标签:s2 s1 long ABC367F 随机化 这道题 哈希 区间

传送门
这道题要求我们对于非常多的询问回答[l,r]、[L,R]这样两个区间内A、B数组中各个数的出现次数是否相同。
看到这道题似乎想到了刚开始学编程的时候就想过的一个问题(bushi,那就是我能不能直接用,例如说这段区间和是否相同,或者说这段区间乘积之类的是否相同来判断这个区间各个数出现次数是否相同。这道题就给了我答案,那就是利用随机化哈希,即,我们对每一个出现在A、B数组中的数都将它变成一个对应的随机的数,然后对于每个询问的区间来看各自的区间和是否相同即可。注意第一次看到这种做法可能觉得非常荒谬,因为它让人觉得跟我们直接求前缀和来判断相等没有什么两样。这其实就是随机化算法的特点,当这个算法正确率已经达到99.9%甚至往上,我们就可以认定这个做法是正确的。这道题正是如此,我们在\(2^{32}\)之内随机\(10^{5}\)量级个数出现两个区间和相同的概率是极小的,而题目给的A、B数组都是关于N的一个排列,这样出现两个区间和相同的概率是很大的。
代码如下:

#include<bits/stdc++.h>

using namespace std;

long long t;
const long long mod = 1e9 + 7;
const long long N = 2e5 + 10;
long long n,qq;
long long a[N],b[N];
long long s1[N],s2[N];
map<long long,long long> q;

void solve() {
    mt19937 myrand(time(nullptr));
    cin >> n >> qq;
    for(long long i = 1;i <= n;i++) {
        cin >> a[i];
        if(!q[a[i]]) q[a[i]] = myrand() % mod;
        a[i] = q[a[i]];
        s1[i] = s1[i-1] + a[i];
    }
    for(long long i = 1;i <= n;i++) {
        cin >> b[i];
        if(!q[b[i]]) q[b[i]] = myrand() % mod;
        b[i] = q[b[i]];
        s2[i] = s2[i-1] + b[i];
    }
    for(long long i = 1;i <= qq;i++) {
        long long l,r,ll,rr;
        cin >> l >> r >> ll >> rr;
        if(s1[r] - s1[l-1] == s2[rr] - s2[ll-1]) cout << "Yes\n";
        else cout << "No\n";
    }
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    t = 1;
    while(t--) solve();

    return 0;
}

标签:s2,s1,long,ABC367F,随机化,这道题,哈希,区间
From: https://www.cnblogs.com/lwiwi/p/18664799

相关文章

  • [数据结构学习笔记10] 哈希表(Hashtable)
    哈希表也叫Hashmap或者Dictionary,它存储和检索都非常快,所以常用于缓存数据供后续快速访问。哈希函数,是这样的一个函数,你提供一个input,它会返回一个唯一的值(hashcode)。只要你的input是相同的,这个哈希函数会返回同样的output。从哈希函数到哈希表哈希表底层是一个数组结构,这意味......
  • Report -「概率数据结构」随机化骗分?我们是专业的!
    \[\mathscr{Lorain~y~w~la~Lora~blea.}\newcommand{\DS}[0]{\displaystyle}%operatorsalias\newcommand{\opn}[1]{\operatorname{#1}}\newcommand{\card}[0]{\opn{card}}\newcommand{\lcm}[0]{\opn{lcm}}\newcommand{\char}[0]{\opn{char}}\newc......
  • Redis数据库笔记—— Hash(哈希)的扩容机制(rehash)
    大家好,这里是GoodNote,关注公主号:Goodnote,专栏文章私信限时Free。详细介绍Hash(哈希)的扩容机制(rehash)、源码、以及扩容和缩容过程。文章目录Redis字典(dict)结构源码哈希表结构定义渐进式哈希扩容(rehash)渐进式哈希的优点扩容机制:rehash扩容条件扩容过程缩容机制:r......
  • 【哈希算法】实战应用
    一、使用哈希进行函数调用使用哈希隐藏API调用代码#include<windows.h>#include<stdio.h>intmain(){MessageBoxA(NULL,"Meow-meow!","=^..^=",MB_OK);return0;}编译i686-w64-mingw32-g++meow.c-omeow.exe-mconsole-I/usr/share/mingw-w64......
  • 六. 哈希表
    哈希表哈希表又称散列表,通过建立键 key 与值 value 之间的映射,实现高效的元素查询。当对哈希表输入键key时,即可查询到对应的值value,其时间复杂度仅为O(1)。1.哈希表1.1.哈希表常用操作1.1.1.基础操作基础操作包括初始化、查询、添加键值对和删除键值对#初始化......
  • 算法解析-经典150(矩阵、哈希表)
    文章目录矩阵1.有效的数独1.答案2.思路2.螺旋矩阵1.答案2.思路3.旋转图像1.答案2.思路4.矩阵置零1.答案2.思路哈希表1.赎金信1.答案2.思路2.同构字符串1.答案2.思路3.单词规律1.答案2.思路4.有效的字母异位词1.答案2.思路5.字母异位词分组1.答案2.思路......
  • 哈希算法篇——散落的秘密与精准的归宿,混沌中的秩序之美(上)
    文章目录引言:混沌中的秩序之美第一章:哈希的本质——化繁为简的魔法第二章:经典哈希函数——一座算法的博物馆第三章:哈希表的奇迹——从无序到有序的转变3.1哈希函数的基本实现3.2基本的哈希表实现3.3哈希算法的实际应用小结引言:混沌中的秩序之美在信息科学的星......
  • Luogu P9646 SNCPC2019 Paper-cutting 题解 [ 紫 ] [ manacher ] [ 贪心 ] [ 哈希 ] [
    Paper-cutting:思维很好,但代码很构式的manacher题。蒟蒻2025年切的第一道题,是个紫,并且基本独立想出的,特此纪念。判断能否折叠我们先考虑一部分能折叠需要满足什么条件。显然,这一部分需要是一个长度为偶数的回文串。那么横向和纵向会不会影响呢?答案是不会,因为横向折了之后,折......
  • 中南大学(CSU)世界杯球赛(10分)—— 哈希表的使用
        孩子们,我回来了。最近OJ的作业比较多,一不小心写昏过去了。在写世界杯球赛这一题时经常因为程序较复杂,运行时间太久而导致时间超限。为此,我痛定思痛,在查阅资料后找到了一种高效、灵活的数据结构——哈希表。现在,我将以这一道题为例来分享哈希表的简单使用。(提示:本......
  • Leecode热题100——1.哈希
    1.两数之和给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,11,15],target......