BZOJ 2141: 排队 [CDQ分治]
题意:
交换序列中两个元素,求逆序对
做分块做到这道题...一看不是三维偏序嘛....
作为不会树套树的蒟蒻就写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分治]的更多相关文章
- bzoj 2141 : 排队 (cdq分治+bit)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2141 思路: 其实就是求动态逆序对...cdq降维,用树状数组前后求两遍逆序对就好了 切水 ...
- [BZOJ 3456]城市规划(cdq分治+FFT)
[BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...
- [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)
[BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...
- BZOJ 2141 排队 (CDQ分治)
[BZOJ2141]排队 这道题和动态逆序对比较像(BZOJ-3295 没做过的同学建议先做这题),只是删除操作变成了交换.解法:交换操作可以变成删除加插入操作,那么这题就变成了 (时间,位置,值)的 ...
- bzoj 4237 稻草人 - CDQ分治 - 单调栈
题目传送门 传送点I 传送点II 题目大意 平面上有$n$个点.问存在多少个矩形使得只有左下角和右上角有点. 考虑枚举左下角这个点.然后看一下是个什么情况: 嗯对,是个单调栈.但不可能暴力去求每个点右 ...
- bzoj 3262 陌上花开 - CDQ分治 - 树状数组
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- bzoj 2141: 排队
2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MB Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我, ...
- Bzoj 2141: 排队 分块,逆序对,树状数组
2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MBSubmit: 1310 Solved: 517[Submit][Status][Discuss] D ...
- bzoj 2141 : 排队 分块
题目链接 2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MBSubmit: 1169 Solved: 465[Submit][Status][Discu ...
随机推荐
- 【Sql】mySQL在windows环境启动
SQL的不同版本在Windows环境启动配置方法不同,此处仅介绍 5.7.20的配置方法: 1.登录mysql官网下载windows环境下的工具压缩包 http://dev.mysql.com/dow ...
- 三分钟使用webpack-dev-sever搭建一个服务器
webpack-dev-server是一个小型的Node.js Express服务器,我们可以通过它搭建一个本地服务器,并且实现文件热更新; 1.切换到你的目录下对项目进行初始化 npm init 一 ...
- Centos7网络配置-转载
一. 查看网络地址: centos7取消了ifconfig命令,使用ip addr命令查看IP地址 二.配置网络 用VirtualBox安装的CentOS7,安装完成后,发现无法上网,于是到网上查了一 ...
- 关于Swing窗体有时候要放大缩小边框才能显示问题?
有时候会出现编写swing窗体后添加的组件在run之后显示不出来的问题.如图: 搜了下解决办法.此时如果是程序里面有panel组件的话,应该这样: labels[i] = new Label(lett ...
- POJ 3461 Oulipo(——KMP算法)
Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...
- 使用 EclEmma 进行覆盖测试
开源软件测试工具 EclEmma,它能够对由 Java 语言编写的程序进行覆盖测试,从而对程序运行的结果生成详尽的覆盖测试报告. UT-Junit 安装 EclEmma 插件 安装 EclEmma 插 ...
- 5分钟把任意网站变成桌面软件--windows版
本文源自于segmentfault的一篇专栏文章:https://segmentfault.com/a/1190000012924855 只不过这篇是MAC版本的,所以我试了下windows版的: ...
- nodejs+websocket实时聊天系统
介绍下websocket: webSocket协议本质上是一个基于tcp的协议; 建立一个websocket连接,大体的过程: 1.客户端浏览器首先向服务器发起一个http请求,这个请求和平常的请求有 ...
- MySQL主从复制的配置
环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso MySQL版本:mysql-5.6.26.tar.gz 主节点IP:192.168.1.205 主机名:edu-m ...
- vim编辑操作
vim 插入模式 a 光标后 A 行尾 o 光标所在行下一行 O 光标所在行上一行 i 光标前 ...