题目:http://codeforces.com/contest/1093/problem/E

只能想到转化成查询一个区间里值在一个范围里的数的个数……

没有想到这样适合用主席树套树状数组维护。不过据说卡空间。

参考了这里的题解:https://www.luogu.org/problemnew/solution/CF1093E

写了CDQ分治。一个值在两个序列里的位置看成两维坐标的话,就是查平面区域内点的个数。

按 x (在第一个序列里的位置)排序,分治操作的时间,y (在第二个序列里的位置)用树状数组解决。

做这一层的时候要先枚举,再消除影响,然后再把 a[ ] 分成两部分。这样才能保证贡献给这个询问的是 x 在它之前、时间在它之前的那些 y 。在树状数组里就不考虑 x 了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+;
int n,m,ta[N],tb[N],pa[N],pb[N],ans[N],tot,f[N],cnt;
struct Node
{
bool fx;int x,y,k,id,tim;
Node(bool f=,int x=,int y=,int k=,int i=,int t=):
fx(f),x(x),y(y),k(k),id(i),tim(t) {}
bool operator< (const Node &b)const
{return x<b.x||(x==b.x&&tim<b.tim);}
}a[(N<<)+N],b[(N<<)+N];//+N
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
void add(int x,int k){for(;x<=n;x+=(x&-x))f[x]+=k;}
int query(int x){int ret=;for(;x;x-=(x&-x))ret+=f[x];return ret;}
void solve(int l,int r)
{
if(l>=r)return;
int mid=l+r>>,p0=l,p1=mid+;
for(int i=l;i<=r;i++)
if(!a[i].fx&&a[i].tim<=mid)add(a[i].y,a[i].k);
else if(a[i].fx&&a[i].tim>mid)ans[a[i].id]+=a[i].k*query(a[i].y);
for(int i=l;i<=r;i++)
if(!a[i].fx&&a[i].tim<=mid)add(a[i].y,-a[i].k);
for(int i=l;i<=r;i++)
if(a[i].tim<=mid)b[p0++]=a[i];
else b[p1++]=a[i];
for(int i=l;i<=r;i++)a[i]=b[i];
solve(l,mid); solve(mid+,r);
}
int main()
{
n=rdn();m=rdn();
for(int i=;i<=n;i++)ta[i]=rdn(),pa[ta[i]]=i;
for(int i=;i<=n;i++)tb[i]=rdn(),pb[tb[i]]=i;
for(int i=;i<=n;i++)
a[++cnt]=Node(,pa[i],pb[i],,,cnt);//
for(int i=,op,x1,y1,x2,y2,w1,w2;i<=m;i++)
{
op=rdn();
if(op==)
{
tot++;
x1=rdn();x2=rdn();y1=rdn();y2=rdn();
x1--; y1--;
a[++cnt]=Node(,x2,y2,,tot,cnt);
a[++cnt]=Node(,x1,y2,-,tot,cnt);
a[++cnt]=Node(,x2,y1,-,tot,cnt);
a[++cnt]=Node(,x1,y1,,tot,cnt);
}
else
{
int w1=rdn(),w2=rdn();
y1=w1;x1=pa[tb[w1]];y2=w2;x2=pa[tb[w2]];
swap(pb[tb[w1]],pb[tb[w1]]);
swap(tb[w1],tb[w2]);
a[++cnt]=Node(,x1,y1,-,,cnt);
a[++cnt]=Node(,x2,y2,-,,cnt);
a[++cnt]=Node(,x1,y2,,,cnt);
a[++cnt]=Node(,x2,y1,,,cnt);
}
}
sort(a+,a+cnt+);
solve(,cnt);
for(int i=;i<=tot;i++)printf("%d\n",ans[i]);
return ;
}

CF 1093E Intersection of Permutations——CDQ分治的更多相关文章

  1. Codeforces 1093E Intersection of Permutations [CDQ分治]

    洛谷 Codeforces 思路 一开始想到莫队+bitset,发现要T. 再想到分块+bitset,脑子一抽竟然直接开始写了,当然也T了. 最后发现这就是个裸的CDQ分治-- 发现\(a\)不变,可 ...

  2. Codeforces 1093E Intersection of Permutations (CDQ分治+树状数组)

    题意:给你两个数组a和b,a,b都是一个n的全排列:有两种操作:一种是询问区间在数组a的区间[l1,r1]和数组b的区间[l2,r2]出现了多少相同的数字,另一种是交换数组b中x位置和y位置的数字. ...

  3. Educational Codeforces Round 56 (Rated for Div. 2) E(1093E) Intersection of Permutations (树套树,pb_ds)

    题意和分析在之前的链接中有:https://www.cnblogs.com/pkgunboat/p/10160741.html 之前补题用三维偏序的cdq的分治A了这道题,但是感觉就算比赛再次遇到类似 ...

  4. 【cdq分治】【CF1093E】 Intersection of Permutations

    传送门 果然前两天写完咕咕咕那个题的题解以后博客就开始咕咕咕了-- Description 给定整数 \(n\) 和两个 \(1~\sim~n\) 的排列 \(A,B\). \(m\) 个操作,操作有 ...

  5. CF 1093 E. Intersection of Permutations

    E. Intersection of Permutations 链接 题意: 给定两个序列,询问第一个排列的[l1,r1]和第二个排列[l2,r2]中有多少个共同的数,支持在第二个排列中交换两个数. ...

  6. HDU5322 Hope(DP + CDQ分治 + NTT)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...

  7. CDQ分治&整体二分学习个人小结

    目录 小结 CDQ分治 二维LIS 第一道裸题 bzoj1176 Mokia bzoj3262 陌上花开 bzoj 1790 矩形藏宝地 hdu5126四维偏序 P3157 [CQOI2011]动态逆 ...

  8. 【教程】简易CDQ分治教程&学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

  9. BZOJ 2683 简单题 ——CDQ分治

    [题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...

随机推荐

  1. DRUID连接池的使用

    DRUID介绍    DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控 DB池连接和SQL的执行情况,可 ...

  2. garylog学习篇

    官方文档:https://www.graylog.org/ 简介 Graylog 是一个简单易用.功能较全面的日志管理工具,相比 ELK 组合, 优点: 部署维护简单查询语法简单易懂(对比ES的语法… ...

  3. echarts在miniUI和ajax下动态渲染数据

    <script src="echarts.js"></script> <script src="jquery-3.3.1.min.js&qu ...

  4. [Android]Adb connection Error:远程主机强迫关闭了一个现有的连接

    目前,针对Android手机研发的刷机软件和手机助手软件,都会调用Google开发的adb工具与手机进行通信. 有的刷机软件或者手机助手软件,在系统里会常驻一个服务,独占adb的端口(5037),这样 ...

  5. 【51nod-1289】大鱼吃小鱼(思维)

    这道题我想的方法是用栈,每次去出栈顶两元素,比较是否相对,相对的话合并后压入栈.类似括号匹配. #include <bits/stdc++.h> using namespace std; ...

  6. docker 快速搭建 WordPress

    安装Docker 环境:阿里云服务器 镜像:CentOs 7.4 64 https://docs.docker.com/install/linux/docker-ce/centos/ 安装WordPr ...

  7. LeetCode OJ:Gray Code(格林码)

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  8. vue.js 源代码学习笔记 ----- 工具方法 lang

    /* @flow */ // Object.freeze 使得这个对象不能增加属性, 修改属性, 这样就保证了这个对象在任何时候都是空的 export const emptyObject = Obje ...

  9. PostgreSQL CheckPoint设置(转)

    今天在研究checkpoint process的问题时,顺便复习了一下checkpoint设置问题,又有新的疑惑了. checkpoint又名检查点,在oracle中checkpoint的发生意味着之 ...

  10. HBase架构解析

    Hbase组件  客户端Client 整个HBase集群的入口 使用HBase RPC机制与HMaster和HRegionserver通信 与HMaster通信进行管理类的操作 与HRegionse ...