首页 > 其他分享 >Atcoder [ABC367F] Rearrange Query 题解

Atcoder [ABC367F] Rearrange Query 题解

时间:2024-08-18 14:27:43浏览次数:13  
标签:Atcoder 映射 题解 cin Rearrange mp s2 随机

简要题意

给定两个长度为 \(N\) 的序列 \(A\) 和 \(B\)。
有 \(Q\) 个查询,每个查询给定 \(l,r,L,R\),其中 \(l \leq r, L \leq R\),要求判断 \(A\) 的第 \(l\) 项到第 \(r\) 项构成的集合与 \(B\) 的第 \(L\) 项到第 \(R\) 项构成的集合是否相等。

题解

显然两个相等的集合所有元素之和相等,但是如果直接判断和肯定是不行的,有反例 1 2 2 32 2 2 2,于是我们考虑类似哈希的做法,把每个数映射到随机的值,然后判断映射值的和是否相等。

这里我们可以用 map 维护映射的随机值,读入时即判断该数是否映射,若没有则赋一个随机值加到 map 中,这里随机值对 \(1000000\) 取模。然后预处理映射的随机值的前缀和,询问时 \(\mathcal{O(1)}\) 减一下判断即可。

代码见下

#include <bits/stdc++.h>
#define _for(i, a, b) for(int i = a; i <= b; i++)
using namespace std;
const int N = 200005;
int n, q, a[N], b[N];
int s[N], s2[N];
map<int, int> mp;
signed main() {
    srand(time(0));
    cin >> n >> q;
    _for(i, 1, n) {
        cin >> a[i];
        if(mp.find(a[i]) == mp.end()) mp[a[i]] = rand() % 1000000;
        s[i] = s[i - 1] + mp[a[i]];
    }
    _for(i, 1, n) {
        cin >> b[i];
        if(mp.find(b[i]) == mp.end()) mp[b[i]] = rand() % 1000000;
        s2[i] = s2[i - 1] + mp[b[i]];
    }
    while(q--) {
        int l, r, L, R; cin >> l >> r >> L >> R;
        if(s[r] - s[l - 1] == s2[R] - s2[L - 1]) puts("Yes");
        else puts("No");
    }
    return 0;
}

标签:Atcoder,映射,题解,cin,Rearrange,mp,s2,随机
From: https://www.cnblogs.com/sunskydp/p/18365614/abc367f_solution

相关文章

  • Atcoder [ABC367C] Enumerate Sequences 题解
    简要题意给定\(n,k\)和\(R_i\),你需要输出所有满足下列条件的整数序列:长度为\(n\)。第\(i\)个元素的范围为\([1,R_i]\)。一个序列的所有元素的总和为\(k\)的倍数。输出请按照按照从左至右按位从小到大的顺序输出。题解注意到数据范围很小,我们可以直接爆搜,这里用......
  • 【动态规划、dp】[CSP-J 2022] 上升点列 题解
    题目描述在一个二维平面内,给定nnn个整数点(xi......
  • 题解:AT_abc367_e [ABC367E] Permute K times
    题意给你一个长度为\(N\)的序列\(X\),其中每个元素都介于\(1\)和\(N\)之间(含),以及一个长度为\(N\)的序列\(A\)。打印在\(A\)上执行以下操作\(K\)次的结果。将\(A_i\)替换为\(A_{X_i}\)。每个操作同时进行。思路元素\(i\)经过\(k\)次变化后的值就是元素......
  • 对树链剖分的爱 题解
    前言题目链接:洛谷。题意简述给出一棵\(n\)个节点以\(1\)为根的有根树。对于第\(2\leqi\leqn\)个节点,其父亲\(f_i\)在\([l_i,r_i]\)中均匀随机。每个树的边有边权,初始为\(0\)。现在有\(m\)次操作,第\(i\)次操作表示将\((u_i,v_i)\)的路径上所有的边的权值统......
  • AtCoder Beginner Contest 367 题解(E~G)
    E转换关系看作有向边,\(n\)点\(n\)边构成基环树森林,基环树森林k后继唯一,记f[i][j]为点\(i\)的\(2^j\)级祖先,随便倍增。F一眼哈希,不知道有没有不哈希的做法。在这里我们不关心元素的顺序,只关心元素是否出现以及出现几次,考虑一个\(n\)位\(n+1\)进制数,\(a_i\)出现一......
  • Atcoder Beginner Contest 367
    A.ShoutEveryday\(\text{Diff}43\)给你\(24\)小时制下的\(A,B,C\)三个时刻,问\(A\)是否在\([B,C]\)范围内考虑到先将\(B,C\)加上一个\(24\),假如\(C\)比\(B\)小,将\(C\)再加上一个\(24\),这样可以保证严格的\(A\ltB,C\),此时直接判断是否存在一个\(k\),使得......
  • [题解]CF76B Mice
    思路比较简单的贪心。对于可以选择两个奶酪的老鼠,我们先将它们忽略掉。现在所有老鼠所吃的奶酪是唯一确定的。考虑加上可以选择两个奶酪的老鼠如何选择。显然,如果它可以选择一个没有任何老鼠吃过的奶酪,它必然这样选择。其次,如果它可以选择的奶酪被吃掉的时间\(t\)与它到达奶......
  • Atcoder Beginner Contest 367 C-F
    AtcoderBeginnerContest367C-FC-EnumerateSequences题意按字典序升序输出所有满足下列条件的序列数量。长度为\(N\)。第\(i\)个元素介于\(1\)与\(R_i\)之间。所有元素之和是\(K\)的倍数。思路搜索即可。搜索时记录当前选了哪些数和元素之和,最后搜......
  • ABC 367 题解
    AtCoderBeginnerContest367题解:\(Problem\hspace{2mm}A-Shout\hspace{2mm}Everyday\)题目链接opinion:~~code:#include<bits/stdc++.h>#definelllonglong#definepiipair<int,int>usingnamespacestd;lla,b,c;intmain(){ i......
  • abc364 题解
    第一次场切A~F,写个题解纪念一下。比赛链接:https://atcoder.jp/contests/abc367A-ShoutEveryday题意:高桥每天\(B\)时刻睡觉,\(C\)时刻起床(\(B,C\)时刻也在睡觉),请问高桥\(A\)时刻是否没睡。思路:对于\(B<=C\)和\(B>C\)分别处理即可。代码:https://atcoder.jp/con......