CF1093:E. Intersection of Permutations(树状数组套主席树)
题意:给定长度为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);常数差不多是4。
因为空间的问题,但是赛场上不少树套树都MLE或者RE了。
这里学到了回收空间:因为这里的节点不可能出现负数,所以如果一个节点的sum为0,那么子树节点的sum值都为0,那么这个子树都可以回收,即把它们赋值为0;
(cdq先补了G再回来补。分块懒得补了。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
struct in{
int l,r,sum;
in(){l=r=sum=;}
}s[maxn*];
queue<int>q;
int rt[maxn],pos[maxn],a[maxn],b[maxn],N,cnt;
void add(int &Now,int L,int R,int pos,int v)
{
if(!Now){
if(!q.empty()) Now=q.front(),q.pop();
else Now=++cnt;
}
s[Now].sum+=v;
if(L==R) return ;int Mid=(L+R)>>;
if(pos<=Mid) add(s[Now].l,L,Mid,pos,v);
else add(s[Now].r,Mid+,R,pos,v);
if(!s[Now].sum) {q.push(Now); Now=;}
}
void Add(int x,int pos,int v)
{
while(x<=N){
add(rt[x],,N,pos,v);
x+=(-x)&x;
}
}
int query(int Now,int L,int R,int l,int r)
{
if(L>R) return ;
if(L<||l<) return ;
if(!Now) return ;
if(l<=L&&r>=R) return s[Now].sum;
int Mid=(L+R)>>,res=;
if(l<=Mid) res+=query(s[Now].l,L,Mid,l,r);
if(r>Mid) res+=query(s[Now].r,Mid+,R,l,r);
return res;
}
int Query(int x,int L,int R)
{
if(L>R) return ; if(x<=) return ;
int res=; while(x){
res+=query(rt[x],,N,L,R);
x-=(-x)&x;
} return res;
}
int main()
{
int M,opt,L1,R1,L2,R2,x,y;
scanf("%d%d",&N,&M);
rep(i,,N) scanf("%d",&a[i]),pos[a[i]]=i;
rep(i,,N) scanf("%d",&b[i]);
rep(i,,N) Add(i,pos[b[i]],);
while(M--){
scanf("%d",&opt);
if(opt==){
scanf("%d%d%d%d",&L1,&R1,&L2,&R2);
int ans=Query(R2,L1,R1)-Query(L2-,L1,R1);
printf("%d\n",ans);
}
else {
scanf("%d%d",&x,&y);
Add(x,pos[b[x]],-); Add(y,pos[b[y]],-);
swap(b[x],b[y]);
Add(x,pos[b[x]],); Add(y,pos[b[y]],);
}
}
return ;
}
CF1093:E. Intersection of Permutations(树状数组套主席树)的更多相关文章
- Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)
E. Anton and Permutation time limit per test 4 seconds memory limit per test 512 megabytes input sta ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
- BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树
[题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...
- BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树
BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...
- ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解
题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...
- P2617 Dynamic Rankings(树状数组套主席树)
P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...
- [COGS257]动态排名系统 树状数组套主席树
257. 动态排名系统 时间限制:5 s 内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...
- BZOJ 2141 排队(树状数组套主席树)
解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...
- 洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】
题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> ...
- 【Luogu】P2617Dynamic Ranking(树状数组套主席树)
题目链接 树状数组套主席树有点难懂qwq 不好理解 树状数组套主席树的直观理解应该是:树状数组的每一个节点是一棵主席树. 普通区间修改我们是创建1个线段树,树状数组套主席树的时候我们就创建log个线段 ...
随机推荐
- 使用cocos创建的项目,如何进行源码调试?
环境cocos3.10,里面包含了cocos2dx 3.10引擎.但是用cocos创建出来的项目,使用的lib和dll是文件夹Cocos\Cocos2d-x\cocos2d-x-3.10\prebui ...
- 流氓 2345.com的新动态及解决方法
安装了[电脑公司]的Win7_SP1之后, IE的主页被绑架. 症状是先转到 IE959.com,然后自动跳转到 www.2345.com 网上当然有很多例子了,可是都没有效果. 1. 更改IE设置没 ...
- Phonetics: Lecture Three 语音 第三课 Teacher:Patrick
元音字母: [u] put [pʊt] push [pʊʃ] full [fʊl] sugar ['ʃʊgɚ] cook [kʊk] look [lʊk] took [tʊk] (v ...
- 12月16日 增加一个购物车内product数量的功能, 自定义method,在helper中定义,计算代码Refactor到Model中。
仿照Rails实战:购物网站 教材:5-6 step5:计算总价,做出在nav上显示购物车内product的数量. 遇到的❌: 1. <% sum = 0 %> <% current ...
- Jersey 2.x 基于 Servlet 的服务器端应用
下面的依赖通常应用到应用服务器上(servlet 容器),同时这个应用服务器上没有整合任何 JAX-RS 的实现. 因此,这个应用服务器需要包含有 JAX-RS API 和 Jersey 实现,同时部 ...
- 『PyTorch』第五弹_深入理解Tensor对象_上:初始化以及尺寸调整
一.创建Tensor 特殊方法: t.arange(1,6,2)t.linspace(1,10,3)t.randn(2,3) # 标准分布,*size t.randperm(5) # 随机排序,从0到 ...
- python-day32--进程--->socker并发
一.进程背景 1.进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 2.进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有 ...
- c#将Excel数据导入到数据库的实现代码
这篇文章主要介绍了c#将Excel数据导入到数据库的实现代码,有需要的朋友可以参考一下 假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: 代码: 代码如下: using Syste ...
- c# 如何将字符串中用","分开的数字分别存入数组中
string[] str="1,2,3,11,12,13".Split(',');
- bzoj3040
题解: 模板题,地界特斯拉+堆优化 注意第一种建边 代码: #include<bits/stdc++.h> using namespace std; typedef long long l ...