我们把每一次交换看做两个插入两个删除。然后就是一个三维偏序。时间一维,下标一维,权值一维。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=100010;
struct query{
int t,x,y,k,w;
}q[N],c[N];
int ans[N],n,a[N],m,tr[N],b[N],cnt;
bool cmp(query a,query b){
return a.t<b.t;
}
int lowbit(int x){
return x&-x;
}
void add(int x,int w){
for(int i=x;i<=n;i+=lowbit(i)){
tr[i]+=w;
}
}
int getsum(int x){
int tmp=0;
for(int i=x;i;i-=lowbit(i)){
tmp+=tr[i];
}
return tmp;
}
void cdq1(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
cdq1(l,mid);cdq1(mid+1,r);
int ll=l;int rl=mid+1;int now=0;
while(ll<=mid&&rl<=r){
if(q[ll].x<=q[rl].x){
add(q[ll].y,q[ll].k);
c[++now]=q[ll++];
}
else{
ans[q[rl].w]+=q[rl].k*(getsum(n)-getsum(q[rl].y));
c[++now]=q[rl++];
}
}
while(ll<=mid){
add(q[ll].y,q[ll].k);
c[++now]=q[ll++];
}
while(rl<=r){
ans[q[rl].w]+=q[rl].k*(getsum(n)-getsum(q[rl].y));
c[++now]=q[rl++];
}
for(int i=l;i<=mid;i++){
add(q[i].y,-q[i].k);
}
for(int i=l;i<=r;i++){
q[i]=c[i-l+1];
}
}
void cdq2(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
cdq2(l,mid);cdq2(mid+1,r);
int ll=l;int rl=mid+1;int now=0;
while(ll<=mid&&rl<=r){
if(q[ll].x>=q[rl].x){
add(q[ll].y,q[ll].k);
c[++now]=q[ll++];
}
else{
ans[q[rl].w]+=q[rl].k*getsum(q[rl].y-1);
c[++now]=q[rl++];
}
}
while(ll<=mid){
add(q[ll].y,q[ll].k);
c[++now]=q[ll++];
}
while(rl<=r){
ans[q[rl].w]+=q[rl].k*getsum(q[rl].y-1);
c[++now]=q[rl++];
}
for(int i=l;i<=mid;i++){
add(q[i].y,-q[i].k);
}
for(int i=l;i<=r;i++){
q[i]=c[i-l+1];
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
int tot=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;i++){
a[i]=lower_bound(b+1,b+1+tot,a[i])-b;
q[++cnt].t=cnt;q[cnt].x=i;q[cnt].y=a[i];q[cnt].k=1;q[cnt].w=0;
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
q[++cnt].t=cnt;q[cnt].x=x;q[cnt].y=a[x];q[cnt].k=-1;q[cnt].w=i;
q[++cnt].t=cnt;q[cnt].x=y;q[cnt].y=a[y];q[cnt].k=-1;q[cnt].w=i;
q[++cnt].t=cnt;q[cnt].x=x;q[cnt].y=a[y];q[cnt].k=1;q[cnt].w=i;
q[++cnt].t=cnt;q[cnt].x=y;q[cnt].y=a[x];q[cnt].k=1;q[cnt].w=i;
swap(a[x],a[y]);
}
cdq1(1,cnt);
sort(q+1,q+1+cnt,cmp);
cdq2(1,cnt);
printf("%d\n",ans[0]);
for(int i=1;i<=m;i++){
ans[i]+=ans[i-1];
printf("%d\n",ans[i]);
}
return 0;
}

BZOJ 2141 排队(CDQ分治)的更多相关文章

  1. BZOJ 2141: 排队 [CDQ分治]

    题意: 交换序列中两个元素,求逆序对 做分块做到这道题...一看不是三维偏序嘛.... 作为不会树套树的蒟蒻就写CDQ分治吧.... 对时间分治...x排序...y树状数组... 交换拆成两个插入两个 ...

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

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

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

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

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

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

  5. BZOJ 2141 排队 (CDQ分治)

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

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

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

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

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

  8. bzoj 2141: 排队

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

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

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

  10. bzoj 2141 : 排队 分块

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

随机推荐

  1. Unity 向量点乘、叉乘

    向量点乘计算角度,向量叉乘计算方位 a,b为向量 点乘计算公式:a x b = |a| x |b| x cosθ 叉乘计算公式:a x b = |a| x |b| x sinθ

  2. ZBrush中Layer层笔刷介绍

    本文我们来介绍ZBrush®中的Layer层笔刷,该笔刷是一种类似梯田效果的笔刷,常用来制作鳞甲和花纹图腾.他还可以用一个固定的数值抬高或降低模型的表面,当笔刷在重合时,笔画重叠部分不会再次位移,这使 ...

  3. Eclipse中使用GIT将已提交到本地的文件上传至远程仓库

    GIT将已提交到本地的文件上传至远程仓库: 1.  右击项目——Team——Push to Upstream,即可将已保存在本地的文件上传推至GIT远程仓库.

  4. 【BZOJ3309】DZY Loves Math - 莫比乌斯反演

    题意: 对于正整数n,定义$f(n)$为$n$所含质因子的最大幂指数.例如$f(1960)=f(2^3 * 5^1 * 7^2)=3$,$f(10007)=1$,$f(1)=0$. 给定正整数$a,b ...

  5. vue2 在methods 中无法获取this对象

    在methods中使用箭头函数无法获取this ExamName:()=> { console.log(this);} 这样就行了: ExamName:function() { console. ...

  6. 四则运算2(最终版)java+jps+sqlServer

    1,设计思想 (1)在java Resources里建立包和类 (2)在类里面写入方法,其中包括生成算式create()和删除算式delete()用来更新数据库中的题目 (3)Show()方法用来随机 ...

  7. iBase4J部署总结

    iBase4J部署总结 序言 最近看到个分布式框架,只有一个字:好.所以部署起来看看.开始的时候说实话遇到了点困难.去码云上看了下,貌似想得到指导要加入一个群,而且需要收费的,反正闲来无事,索性自己搞 ...

  8. WinServer-IIS-FTP服务器

    在设置FTP服务器的时候,注意SSL的设置,简单尝试的话,不需要启用SSL 常用FTP命令 ftp   进入FTP命令模式 open 192.168.10.6     (连接到FTP主机,或者open ...

  9. HDOJ 5294 Tricks Device 最短路(记录路径)+最小割

    最短路记录路径,同一时候求出最短的路径上最少要有多少条边, 然后用在最短路上的边又一次构图后求最小割. Tricks Device Time Limit: 2000/1000 MS (Java/Oth ...

  10. poj - 1050 - To the Max(dp)

    题意:一个N * N的矩阵,求子矩阵的最大和(N <= 100, -127 <= 矩阵元素 <= 127). 题目链接:http://poj.org/problem?id=1050 ...