[CF1093E]Intersection of Permutations

题目大意:

给定两个长度为\(n(n\le2\times10^5)\)的排列\(A,B\)。\(m(m\le2\times10^5)\)次操作,操作分为以下两种:

  1. 询问有多少同时在\(A_{[x,y]}\)和\(B_{[l,r]}\)中出现的数。
  2. 交换\(B_x\)与\(B_y\)。

思路:

令\(v[a[i]]=i,b[i]=v[b[i]]\),这样询问就变成\([x,y]\)中有多少数在\(B_{[l,r]}\)中出现。

用树状数组+平衡树维护每个区间出现哪些数,询问时在平衡树中查找排名即可。

源代码:

#include<cstdio>
#include<cctype>
#include<climits>
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/pb_ds/assoc_container.hpp>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=2e5+1;
int n,v[N],a[N];
using namespace __gnu_pbds;
using RBTree=tree<int,null_type,std::less<int>,rb_tree_tag,tree_order_statistics_node_update>;
class FenwickTree {
private:
RBTree t[N];
int lowbit(const int &x) const {
return x&-x;
}
int query(int p,const int &x,const int &y) const {
int ret=0;
for(;p;p-=lowbit(p)) {
const int L=*t[p].lower_bound(x);
const int R=*std::prev(t[p].upper_bound(y));
if(L<=R) ret+=t[p].order_of_key(R)-t[p].order_of_key(L)+1;
}
return ret;
}
public:
void init() {
for(register int i=1;i<=n;i++) {
t[i].insert(INT_MIN);
t[i].insert(INT_MAX);
}
}
void insert(int p,const int &x) {
for(;p<=n;p+=lowbit(p)) {
t[p].insert(x);
}
}
void erase(int p,const int &x) {
for(;p<=n;p+=lowbit(p)) {
t[p].erase(x);
}
}
int query(const int &l,const int &r,const int &x,const int &y) const {
return query(r,x,y)-query(l-1,x,y);
}
};
FenwickTree t;
int main() {
n=getint();
const int m=getint();
for(register int i=1;i<=n;i++) {
v[getint()]=i;
}
for(register int i=1;i<=n;i++) {
a[i]=v[getint()];
}
t.init();
for(register int i=1;i<=n;i++) {
t.insert(i,a[i]);
}
for(register int i=0;i<m;i++) {
const int opt=getint(),x=getint(),y=getint();
if(opt==1) {
const int l=getint(),r=getint();
printf("%d\n",t.query(l,r,x,y));
}
if(opt==2) {
t.erase(x,a[x]);
t.erase(y,a[y]);
std::swap(a[x],a[y]);
t.insert(x,a[x]);
t.insert(y,a[y]);
}
}
return 0;
}

最新文章

  1. PHP数据类型之间的强制转换
  2. Learning jQuery, 4th Edition 勘误表
  3. hdu.1198.Farm Irrigation(dfs +放大建图)
  4. ZedBoard 引脚约束参考
  5. 读书笔记_Effective_C++_条款四十二:了解typename的双重意义
  6. MyEclipse------如何在特定目录下创建文件夹
  7. POJ 3069 Saruman&#39;s Army(萨鲁曼军)
  8. Linux vi 中移动光标 命令
  9. redis info命令详解
  10. Extjs 实现输入数量,实时更改总价
  11. aspnetpager+repeater+oracle实现分页功能
  12. [WPF疑难] 继承自定义窗口
  13. MongoDB学习(翻译2)
  14. Django: 之用户注册、缓存和静态网页
  15. JavaSE教程-02Java基本语法-思维导图
  16. 网页设计——4.html基本标签链接,图片,表格
  17. CentOS7安装最新版git教程
  18. print语句中逗号(,)和反斜杠(\)的区别
  19. Objective-C中的消息发送总结
  20. json和ajax学习

热门文章

  1. windows bat 批处理 执行 for 循环无法执行?
  2. MYSQL的学习
  3. 【实验四】[bx]和loop的使用
  4. 关于微信emoji 表情数据库存不了,或者显示为???的问题
  5. python捕获异常及方法总结
  6. python 机器学习三剑客 之 Matplotlib
  7. node.js+mongodb 爬虫
  8. 留恋 nyoj 854
  9. ebe
  10. pads&#160;layout 自动打地孔