题意:

交换序列中两个元素,求逆序对


做分块做到这道题...一看不是三维偏序嘛....

作为不会树套树的蒟蒻就写CDQ分治吧....

对时间分治...x排序...y树状数组...

交换拆成两个插入两个删除,保存一下类型就行了

才发现逆序对问题的删除操作不用时间倒流也可以,直接减去它形成的逆序对数并且在树状数组中删除就可以了

然后愚蠢的我竟然把操作的时间弄成相同的调了一会才觉得不对....

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=1e5+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int n,Q,a[N],mp[N];
int m,tim;
struct meow{
int t,x,y,type,qid;
meow(){}
meow(int a,int b,int c,int d,int e=):t(a),x(b),y(c),type(d),qid(e){}
bool operator <(const meow &r) const{
return x==r.x ? y<r.y : x<r.x;
}
}q[N],t[N];
int ans[N]; int c[N];
inline void add(int p,int v){for(;p<=n;p+=(p&-p)) c[p]+=v;}
inline int sum(int p){int re=; for(;p;p-=(p&-p)) re+=c[p]; return re;} void CDQ(int l,int r){
if(l==r) return;
int mid=(l+r)>>;
for(int i=l;i<=r;i++){
if(q[i].t<=mid) add(q[i].y,q[i].type);
else ans[q[i].qid]+= q[i].type*( sum(n)-sum(q[i].y) );
}
for(int i=l;i<=r;i++) if(q[i].t<=mid) add(q[i].y,-q[i].type); for(int i=r;i>=l;i--){
if(q[i].t<=mid) add(q[i].y,q[i].type);
else ans[q[i].qid]+= q[i].type*sum(q[i].y-);
}
for(int i=l;i<=r;i++) if(q[i].t<=mid) add(q[i].y,-q[i].type); int p1=l,p2=mid+;
for(int i=l;i<=r;i++){
if(q[i].t<=mid) t[p1++]=q[i];
else t[p2++]=q[i];
}
for(int i=l;i<=r;i++) q[i]=t[i];
CDQ(l,mid); CDQ(mid+,r);
} int main(){
freopen("in","r",stdin);
n=read();
for(int i=;i<=n;i++) a[i]=mp[i]=read();
sort(mp+,mp++n); mp[]=unique(mp+,mp++n)-mp-;
for(int i=;i<=n;i++)
a[i]=lower_bound(mp+,mp++mp[],a[i])-mp, q[++m]=meow(++tim,i,a[i],, );
n=mp[];//Look,here I changed the n. Q=read();
for(int i=;i<=Q;i++){
int p1=read(),p2=read();
q[++m]=meow(++tim,p1,a[p2], , i); q[++m]=meow(++tim,p2,a[p1], , i);
q[++m]=meow(++tim,p1,a[p1],-, i); q[++m]=meow(++tim,p2,a[p2],-, i);
swap(a[p1],a[p2]);
}
sort(q+,q++m);
CDQ(,m);
printf("%d\n",ans[]);
for(int i=;i<=Q;i++) ans[i]+=ans[i-],printf("%d\n",ans[i]);
}

BZOJ 2141: 排队 [CDQ分治]的更多相关文章

  1. bzoj 2141 : 排队 (cdq分治+bit)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2141 思路: 其实就是求动态逆序对...cdq降维,用树状数组前后求两遍逆序对就好了 切水 ...

  2. [BZOJ 3456]城市规划(cdq分治+FFT)

    [BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...

  3. [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)

    [BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...

  4. BZOJ 2141 排队 (CDQ分治)

    [BZOJ2141]排队 这道题和动态逆序对比较像(BZOJ-3295 没做过的同学建议先做这题),只是删除操作变成了交换.解法:交换操作可以变成删除加插入操作,那么这题就变成了 (时间,位置,值)的 ...

  5. bzoj 4237 稻草人 - CDQ分治 - 单调栈

    题目传送门 传送点I 传送点II 题目大意 平面上有$n$个点.问存在多少个矩形使得只有左下角和右上角有点. 考虑枚举左下角这个点.然后看一下是个什么情况: 嗯对,是个单调栈.但不可能暴力去求每个点右 ...

  6. bzoj 3262 陌上花开 - CDQ分治 - 树状数组

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

  7. bzoj 2141: 排队

    2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MB Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我, ...

  8. Bzoj 2141: 排队 分块,逆序对,树状数组

    2141: 排队 Time Limit: 4 Sec  Memory Limit: 259 MBSubmit: 1310  Solved: 517[Submit][Status][Discuss] D ...

  9. bzoj 2141 : 排队 分块

    题目链接 2141: 排队 Time Limit: 4 Sec  Memory Limit: 259 MBSubmit: 1169  Solved: 465[Submit][Status][Discu ...

随机推荐

  1. Java数据结构和算法(十二)——2-3-4树

    通过前面的介绍,我们知道在二叉树中,每个节点只有一个数据项,最多有两个子节点.如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树.本篇博客我们将介绍的——2-3-4树,它是一种多叉树,它的每 ...

  2. Java入门篇(五)——Java的字符串/String类

    前面在举例时有出现过String的例子,当时肯定有一部分朋友不知道这个是做什么用的.其实String类是Java中一个比较特殊的类,字符串即String类,它不是Java的基本数据类型之一,但可以像基 ...

  3. {style}/index_article.htm {style}表示什么意思啊

    LS有点安全意识好不好.... 在你的后台系统设置有个"模板默认风格:________  cfg_df_style " 默认是default也就是 {style}=模板路径+模板默 ...

  4. 认识Java(2)

    注释 对程序的一段文字描述 可方便其他用户的阅读,增加代码的可读性.可以注销掉代码,等需要的时候再用. 编译器会自动忽视被注释的内容. 分类: 单行注释 // 多行注释 /* */ 文档注释/** * ...

  5. Cocoa的MVC架构分析

    Cocoa是Mac OS和iPhone OS上的开发框架,使用Objective-C做为开发语言.当然,在代码中也可以嵌入C和C++的语句.初识Objective-C时会觉得它的语法很奇怪,但本质上和 ...

  6. CCF系列之ISBN号码(201312-2)

    试题名称: ISBN号码 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规 ...

  7. 使用异步方法在XAML中绑定系统时间

    最近的工作需要在程序界面上显示实时的系统时间,网上查了查大部分都是用Timer或者线程来实现. 个人非常不喜欢用Timer,感觉这东西有点太耗资源,然后思考了下觉得更好的方法应该是使用异步的方法在委托 ...

  8. 关于多台机器之前session共享,sessionState mode="StateServer" 问题的困扰

    .net 多台机器共享session是很老的技术,一直很少用到session. 最近就出现了一个问题:三台前端,其中一台保存的session值死活不对,一样的环境,一样的配置文件,就是和另外两台获得的 ...

  9. JSTL与EL的区别

    JSTL JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的.JSTL只能运行在支持J ...

  10. 嵌入式QT移植

    1  开发环境 目标版:FS4412(Cortex-A9)开发板 交叉工具链:arm-linux-gcc 4.6.4 版本 Qt:qt-everywhere-opensource-src-5.4.2. ...