[CF1093E]Intersection of Permutations】的更多相关文章

[CF1093E]Intersection of Permutations 题目大意: 给定两个长度为\(n(n\le2\times10^5)\)的排列\(A,B\).\(m(m\le2\times10^5)\)次操作,操作分为以下两种: 询问有多少同时在\(A_{[x,y]}\)和\(B_{[l,r]}\)中出现的数. 交换\(B_x\)与\(B_y\). 思路: 令\(v[a[i]]=i,b[i]=v[b[i]]\),这样询问就变成\([x,y]\)中有多少数在\(B_{[l,r]}\)中出…
\(\color{#0066ff}{ 题目描述 }\) 给定整数 \(n\) 和两个 \(1,\dots,n\) 的排列 \(a,b\). \(m\) 个操作,操作有两种: \(1\ l_a\ r_a\ l_b\ r_b\),设 \(a\) 的 \([l_a;r_a]\) 区间内的元素集合为 \(S_a\),设 \(b\) 的 \([l_b;r_b]\) 区间内的元素集合为 \(S_b\),求 \(\lvert S_a \bigcap S_b \rvert\). \(2\ x\ y\),交换 \…
分析 裸的二维数点,博主用树状数组套平衡树写的,顺便pbds真好用. Update on 2018/12/20:再解释一下为什么是二维数点,第一维是\(la \leq i \leq ra\),第二维是\(lb \leq c_i \leq rb\),其中\(c_i\)表示\(a\)中第\(i\)个数在\(b\)中出现的位置. 代码 #include <iostream> #include <cstdio> #include <cstdlib> #include <c…
大家好, 我非常喜欢暴力数据结构, 于是就用分块A了此题 分块题,考虑前缀和 \(b_i\) 表示 bitset 即 \(0\) ~ $i $ 出现过的数字,然后考虑直接暴力复制块然后前缀和,修改也很简单,直接删除完了 swap 一下,再弄回去 时间复杂度 \(O(q \sqrt n + q \frac{n}{w})\) // by Isaunoya #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loop…
E. Intersection of Permutations 链接 题意: 给定两个序列,询问第一个排列的[l1,r1]和第二个排列[l2,r2]中有多少个共同的数,支持在第二个排列中交换两个数. 分析: 首先求出一个数组,c[i],第二个排列的这个数字在第一个排列中出现的位置.那么查询就是询问c数组中的[l2,r2]中的有多少个数字的在[l1,r1]之间.此时可以差分+离线+树状数组在$nlogn$的时间复杂度内完成. 考虑修改操作,考虑cdq分治.在b排列中交换两个数,那么也就是c数组中交…
传送门 果然前两天写完咕咕咕那个题的题解以后博客就开始咕咕咕了-- Description 给定整数 \(n\) 和两个 \(1~\sim~n\) 的排列 \(A,B\). \(m\) 个操作,操作有两种: \(1~,~l1~,~r1~,~l2~,~r2\) 求\((\bigcup_{i=l1}^{r1} A_i)~\bigcap~(\bigcup_{i=l2}^{r2} B_i)\) \(2~,~x~,~y\) 交换 \(B_x,~B_y\) Input 第一行是两个正整数 \(n,m\) 下…
题目:http://codeforces.com/contest/1093/problem/E 只能想到转化成查询一个区间里值在一个范围里的数的个数…… 没有想到这样适合用主席树套树状数组维护.不过据说卡空间. 参考了这里的题解:https://www.luogu.org/problemnew/solution/CF1093E 写了CDQ分治.一个值在两个序列里的位置看成两维坐标的话,就是查平面区域内点的个数. 按 x (在第一个序列里的位置)排序,分治操作的时间,y (在第二个序列里的位置)用…
洛谷 Codeforces 思路 一开始想到莫队+bitset,发现要T. 再想到分块+bitset,脑子一抽竟然直接开始写了,当然也T了. 最后发现这就是个裸的CDQ分治-- 发现\(a\)不变,可以处理出每个数在\(a\)中的位置\(pos\). 然后处理出\(aa_i=pos_{b_i}\),交换时就是\(swap(aa_x,aa_y)\). 把每个位置看成\((i,aa_i)\)的点,查询\(l1,r1,l2,r2\)时就是查以\((l2,l1)\)为左下角,\((r2,r1)\)为右上…
题意:给两个排列,2种操作1,查询两个区间a和b一样的值个数,2,交换b的两个值 题解:树套树,先把a变成1到n的排列,对b做相同的变换,然后问题就变成了查询区间lb,rb中la到ra的个数,带修改可以树状数组套主席树,需要内存回收 //#pragma GCC optimize(2) //#pragma GCC optimize(3) //#pragma GCC optimize(4) //#pragma GCC optimize("unroll-loops") //#pragma c…
题意:给定长度为N的a数组,和b数组,a和b都是1到N的排列: 有两种操作,一种是询问[L1,R1],[L2,R2]:即问a数组的[L1,R1]区间和b数组的[L2,R2]区间出现了多少个相同的数字. 一种是修改b数组两个位置的值. 思路:如果把b数组每个数取对应a数组对应数的位置,即按照b的下标建立横坐标,纵坐标是它在a中的位置,那么问题就成了,询问在区间[L2,R2]里面,多少个数在[L1,R1]这区间.  这很明显就是主席树可以解决的了.时间复杂度是O(N*logN*logN):常数差不多…