CF1093E Intersection of Permutations 树状数组套权值线段树
\(\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\),交换 \(b\) 的第 \(x\) 位与第 \(y\) 位。
\(1 \le n,m \le 2 \cdot 10^5\)
\(\color{#0066ff}{输入格式}\)
第一行,两个整数 \(n,m\) 以下两行,每行 \(n\) 个整数,分别表示 \(a,b\)。 以下 \(m\) 行,每行一个操作。
\(\color{#0066ff}{输出格式}\)
对于每个 \(1\) 操作,输出答案。
\(\color{#0066ff}{输入样例}\)
6 7
5 1 4 2 3 6
2 5 3 1 4 6
1 1 2 4 5
2 2 4
1 1 2 4 5
1 2 3 3 5
1 1 6 1 2
2 4 1
1 4 4 1 3
\(\color{#0066ff}{输出样例}\)
1
1
1
2
0
\(\color{#0066ff}{数据范围与提示}\)
\(2\leq n \leq 2*10^5, 1\leq m \leq 2*10^5\)
\(\color{#0066ff}{ 题解 }\)
对于排列的每个元素,都有在a中出现的位置pa,在b中出现的位置pb
将其当做二维点(pa,pb),那么其实这题就建好模了
给你二维平面上的一些点
有交换两个点的y坐标操作
每次查询一个矩形内有多少点
树套树
树状数组套权值线段树
树状数组维护pb, 权值线段树维护对应区间的pa
在权值线段树上找到对应区间返回
要写数组版,而且还得内存回收,作为指针选手,以哭晕qwq
#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; int x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int maxn = 1e6 * 40;
const int N = 2e5 + 10;
struct node {
int num;
int ch[2];
int &operator [] (const int &b) {
return ch[b];
}
node(int a = 0): num(a) {
ch[0] = ch[1] = 0;
}
}e[maxn];
int a[N], b[N], pa[N], pd[N], cnt;
int root[N];
int n, m;
int sta[N], top;
int low(int x) { return (x) & (-x); }
int newnode() {
return top? sta[top--] : ++cnt;
}
void add(int &now, int pos, int k, int l, int r) {
if(!now) now = newnode();
e[now].num += k;
if(l == r) return;
int mid = (l + r) >> 1;
if(pos <= mid) add(e[now][0], pos, k, l, mid);
else add(e[now][1], pos, k, mid + 1, r);
if(!e[now].num) sta[++top] = now, now = 0;
}
void add(int pos, int val, int k) {
for(int i = pos; i <= n; i += low(i))
add(root[i], val, k, 1, n);
}
int query(int L, int R, int now, int l, int r) {
if(!now) return 0;
if(L <= l && r <= R) return e[now].num;
int mid = (l + r) >> 1, tot = 0;
if(L <= mid) tot += query(L, R, e[now][0], l, mid);
if(R > mid) tot += query(L, R, e[now][1], mid + 1, r);
return tot;
}
int query(int L, int R, int l, int r) {
int ans = 0;
for(int i = L - 1; i; i -= low(i)) ans -= query(l, r, root[i], 1, n);
for(int i = R; i; i -= low(i)) ans += query(l, r, root[i], 1, n);
return ans;
}
int main() {
n = in(), m = in();
for(int i = 1; i <= n; i++) a[i] = in(), pa[a[i]] = i;
for(int i = 1; i <= n; i++) b[i] = pa[in()];
for(int i = 1; i <= n; i++) add(i, b[i], 1);
int flag, l, r, L, R;
while(m --> 0) {
flag = in();
if(flag == 1) {
L = in(), R = in(), l = in(), r = in();
printf("%d\n", query(l, r, L, R));
}
else {
l = in(), r = in();
add(l, b[l], -1);
add(r, b[r], -1);
add(l, b[r], 1);
add(r, b[l], 1);
std::swap(b[l], b[r]);
}
}
return 0;
}
CF1093E Intersection of Permutations 树状数组套权值线段树的更多相关文章
- BZOJ2141排队——树状数组套权值线段树(带修改的主席树)
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...
- luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)
带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...
- Dynamic Rankings(树状数组套权值线段树)
Dynamic Rankings(树状数组套权值线段树) 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[ ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
- 刷题总结——骑士的旅行(bzoj4336 树链剖分套权值线段树)
题目: Description 在一片古老的土地上,有一个繁荣的文明. 这片大地几乎被森林覆盖,有N座城坐落其中.巧合的是,这N座城由恰好N-1条双 向道路连接起来,使得任意两座城都是连通的.也就是说 ...
- 「ZJOI2017」树状数组(二维线段树)
「ZJOI2017」树状数组(二维线段树) 吉老师的题目真是难想... 代码中求的是 \(\sum_{i=l-1}^{r-1}a_i\),而实际求的是 \(\sum_{i=l}^{r}a_i\),所以 ...
- 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树
题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...
- 牛客网 暑期ACM多校训练营(第一场)J.Different Integers-区间两侧不同数字的个数-离线树状数组 or 可持久化线段树(主席树)
J.Different Integers 题意就是给你l,r,问你在区间两侧的[1,l]和[r,n]中,不同数的个数. 两种思路: 1.将数组长度扩大两倍,for(int i=n+1;i<=2* ...
随机推荐
- Ubuntu14.04LTS上安装Pip
pip是一个安装和管理Python包的工具.在Pip的帮助下,你可以安装独特版本的包. 最重要的是,Pip可以通过一个“requirements”的工具来管理一个由包组成的列表和版本号. Pip很像e ...
- 浅析JAVA Runtime原理与过各大厂商免杀webshell制作
Author:Sevck Date:2017年6月24日 昨天在网络尖刀老年活动中心群里,忽然想到一个问题,就是JAVA在运行Runtime执行命令的时候会不会调用bash,因为php等语言会调用ba ...
- 【ZooKeeper怎么玩】之一:为什么需要ZK
博客已经搬家,见[ZooKeeper怎么玩]之一:为什么需要ZK 学习新东西首先需要搞清楚为什么学它,这是符合我们的一个认知过程.<!--more-->#ZooKeeper是什么ZooKe ...
- 2015.5.9 C#编写DLL及C#调用C#DLL
过程比C#调用VC++dll简单. 一.创建DLL 新建工程,类型选择类库,生成的结果就是dll 注意:在项目属性-应用程序中,注意三个地方,程序集名称和默认命名空间可以调整,但要一致,别的程序调用此 ...
- Vue指令学习
# new Vue({ vue所有的数据都是放到data里面的 # data:{ vue对象的数据 # a:1,对象 # b:[] , # } # methods:{vue对象的方法 # dosomt ...
- 问题:C# TrimEnd 去掉最后的逗号;结果: C#中 TrimEnd()用法
C#中 TrimEnd()用法 ①去除最后的逗号 string str=ab,cd,ef,; str=str.TrimEnd(new char[] { ',' }); 返回结果则是:ab,cd,ef ...
- DAY20-Django之FileField与ImageField
ImageField 和 FileField 可以分别对图片和文件进行上传到指定的文件夹中. 1. 在下面的 models.py 中 : picture = models.ImageField(upl ...
- python爬虫实战(2)--爬取百度贴吧
本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件 1.URL格式的确定 先观察百度贴吧url格式,以中南财经政法大学迎新帖为例,URL我们 ...
- 由浅入深漫谈margin属性
margin 在中文中我们翻译成外边距或者外补白(本文中引用外边距).他是元素盒模型(box model)的基础属性. 一.margin的基本特性 margin 属性包括 margin-top, ma ...
- mongoDB的学习
一:linux下安装mongoDB 1.在linux系统上安装MongoDB 上传安装包mongodb-linux-x86_64-3.0.6.tgz到linux系统的home目录下 tar -zxvf ...