题意:

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


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

作为不会树套树的蒟蒻就写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. 从零开始学习前端JAVASCRIPT — 6、JavaScript基础DOM

    1:DOM(Document  Object  Model)的概念和作用 document对象是DOM核心对象:对html中的内容,属性,样式进行操作. 节点树中节点之间的关系:父子,兄弟. 2:DO ...

  2. C++异常层次结构

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class MyArray { publi ...

  3. Oracle:控制语句 IF..ELSIF语句、CASE语句、FOR循环语句

    --多重if语句(注意点:BEGIN END ,IF 条件 THEN,ELSIF 条件 THEN,ELSE... END IF)BEGIN IF FALSE THEN DBMS_OUTPUT.put_ ...

  4. 搭建mybatis时的小问题

    1.源文件中的xml文件经过编译后没有打包到classes中去,在源文件包中写的mapper文件运行时找不到. 解决办法: pom文件build下添加编译时加入xml和resource文件下的所有文件 ...

  5. 【开发技术】eclipse中格式化代码快捷键Ctrl+Shift+F失效的解决办法

    要格式化代码的时候,右键-source-format能够起效,但ctrl+shift+f不好使了. 原来是和“简繁体快捷键”冲突了.输入法中的这个快捷键我们一般不用,小勾勾去掉就成了. eclipse ...

  6. 读书笔记之《Java编程思想》

    17. 容器 Set 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素. Set接口不保证维护元素的次序 Map 映射表(关联数组)的基本思想是维护的是键-值(对)关联,因此可以用键来查找 ...

  7. [原创]消灭eclipse中运行启动的错误:“找不到或无法加载主类”问题

    最近一直遇到这个问题且根据网上的文章做法基本无法通过,故将自己的解决步骤记录及分享给大家. 一:环境必须要配置好. 试试在dos界面输入:java.javac 分别这两个命令是否能执行,如果都能执行恭 ...

  8. 解决前端页面a标签嵌套a标签bug

    在前端页面中,一般二级导航栏会出现a嵌套a标签出现重复的父元素a标签bug 比如: <nav class="nav"> <ul> <li> &l ...

  9. strman--java8字符串工具类

    strman-java 是Java8的字符串处理库,它的灵感来自 dleitee/strman . Strmen-java 是一个字符串处理工具,你可以通过 maven 将它引入到项目中.除了 Jav ...

  10. 有关linux下redis overcommit_memory的问题

    公司的几台Redis服务器出现不明故障,查看Redis日志,发现如下提示: 1 [34145] 01 Jan 17:42:02 # WARNING overcommit_memory is set t ...