链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2141

思路:

其实就是求动态逆序对。。。cdq降维,用树状数组前后求两遍逆序对就好了

切水题真爽QAQ

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M = 1e5+10;
int c[M<<2],a[M],b[M],ans[M];
int n,m;
struct node{int x,y,t;int kind,id;node(){}node(int a,int b,int c,int d,int e):t(a),x(b),y(c),kind(d),id(e){}bool operator < (const node &k) const {if(x == k.x) return t < k.t;return x < k.x;}
}q[M],t[M];void add(int x,int val){while(x <= n){c[x] += val;x += (x&-x);}
}int getsum(int x){int sum = 0;while(x){sum += c[x];x -= (x&-x);}return sum;
}void cdq(int l,int r){if(l >= r) return ;int mid = (l + r) >> 1;for(int i = l;i <= r;i ++){if(q[i].t <= mid) add(q[i].y,q[i].kind);else ans[q[i].id] += q[i].kind*(getsum(n) - getsum(q[i].y));}for(int i = l;i <= r;i ++)if(q[i].t <= mid) add(q[i].y,-q[i].kind);for(int i = r;i >= l;i --){if(q[i].t <= mid) add(q[i].y,q[i].kind);else ans[q[i].id] += q[i].kind*(getsum(q[i].y-1));}for(int i = r;i >= l;i --)if(q[i].t <= mid) add(q[i].y,-q[i].kind);int L = l,R = mid+1;for(int i = l;i <= r;i ++){if(q[i].t <= mid) t[L++] = q[i];else t[R++] = q[i];}for(int i = l;i <= r;i ++) q[i] = t[i];cdq(l,mid); cdq(mid+1,r);
}int main()
{scanf("%d",&n);for(int i = 1;i <= n;i ++){scanf("%d",&a[i]);b[i] = a[i];}int cnt = 0;sort(b+1,b+1+n);int len = unique(b+1,b+1+n)-b-1;for(int i = 1;i <= n;i ++){a[i] = lower_bound(b+1,b+len+1,a[i])-b;q[++cnt] = node(cnt,i,a[i],1,0);}scanf("%d",&m);for(int i = 1;i <= m;i ++){int x,y;scanf("%d%d",&x,&y);q[++cnt] = node(cnt,x,a[y],1,i);q[++cnt] = node(cnt,x,a[x],-1,i);q[++cnt] = node(cnt,y,a[x],1,i);q[++cnt] = node(cnt,y,a[y],-1,i);swap(a[x],a[y]);}sort(q+1,q+cnt+1);cdq(1,cnt);printf("%d\n",ans[0]);for(int i = 1;i <= m;i ++){ans[i] += ans[i-1];}for(int i = 1;i <= m;i ++)printf("%d\n",ans[i]);
}

转载于:https://www.cnblogs.com/kls123/p/9530823.html

bzoj 2141 : 排队 (cdq分治+bit)相关推荐

  1. BZOJ 4285 使者 (CDQ分治+dfs序)

    题目传送门 题目大意:给你一棵树,有三种操作,在两个点之间连一个传送门,拆毁一个已有的传送门,询问两个点之间的合法路径数量.一条合法路径满足 1.经过且仅经过一个传送门 2.不经过起点终点简单路径上的 ...

  2. bzoj 4237: 稻草人 cdq分治

    求有多少个点对  其一个点为左下角  一个点为右下角所形成的矩形内部没有点 每个x与y都不同 一开始的思路: 先按照x坐标排序  进行cdq分治 然后在cdq内对y进行排序  枚举mid+1-r的点作 ...

  3. BZOJ 2141 排队(块套树,分块,树状数组)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2141 是 hydro 的 BZOJ ...

  4. bzoj 1176 Mokia (cdq分治)

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MB Submit: 3874  Solved: 1742 [Submit] ...

  5. [bzoj] 1176 Mokia || CDQ分治

    原题 给出W×W的矩阵(S没有用,题目有误),给出无限次操作,每次操作的含义为: 输入1:你需要把(x,y)(第x行第y列)的格子权值增加a 输入2:你需要求出以左下角为(x1,y1),右上角为(x2 ...

  6. 洛谷P1966 火柴排队(cdq分治 + 逆序对)

    2020.6.8 练二分了当然要练练分治,这些基础的处理手段真的还是蛮好用的. 这道题是问ai 和bi的平方和最小,最少需要的相邻的交换次数.手动模拟了一下感觉没什么思路.但是后来注意到每次只能移动相 ...

  7. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...

  8. cdq分治(bzoj 1176: [Balkan2007]Mokia bzoj 2683: 简单题)

    CDQ分治: 本质:对询问进行分治 优点:和莫队分块一样都属于技巧,关键时刻能免去复杂的数据结构,常数小 缺点:必须离线 参考:http://blog.csdn.net/hbhcy98/article ...

  9. BZOJ 1176[Balkan2007]Mokia (cdq分治,矩阵加矩阵求和)

    BZOJ 1176[Balkan2007]Mokia (cdq分治,矩阵加矩阵求和) Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值. ...

最新文章

  1. 网络对抗技术-实验报告一
  2. vue 获取元素在浏览器的位置_JavaScript获取窗口位置和元素坐标(兼容版)
  3. 微信小程序技巧-让特定组件首页始终展示修改编译条件即可,不用改json
  4. HDOJ 1233 (克鲁斯卡尔+并查集)
  5. Unity3D学习笔记(二十五):文件操作
  6. Openstack基础架构和各组件的关系
  7. 局域网技术与组网工程实训
  8. 真实VS虚拟,虚拟现实如何定义
  9. Monkey测试:日志信息分析
  10. Java 13新特性:switch表达式,文本块
  11. 如何找到想要的资源?
  12. HTML5期末大作业:家乡网站设计——石家庄(10页) HTML+CSS+JavaScrip 旅游网页html 家乡介绍html网页设计 dw旅游景点网页设计 web课程设计网页规划与设计
  13. 浅谈俄式硬核游戏《逃离塔科夫》:却让人沉浸其中
  14. 频响测试软件的使用教程,频谱分析仪的使用方法与技巧
  15. android从九宫格全屏预览,仿微信朋友圈展示图片的九宫格图片展示控件,支持点击图片全屏预览大图...
  16. 【MATLAB】将raw转为视频(avi格式、mp4格式)并输出(代码分享)
  17. 远程连接访问mysql数据库
  18. hdu2018 母牛的故事(模拟)
  19. (4.2.49)微信APM:Matrix源码浅析
  20. javascript插件的几种写法

热门文章

  1. (七)lucene之中文检索和高亮显示以及摘要
  2. 转] 两种自定义表单设计方案
  3. AGC018C Coins (set)
  4. C# 进程间通信(共享内存)
  5. .NET : 自定义TraceListener
  6. VS2005-此计算机上已安装了试用版。必须先卸载以前安装的试用版后才能安装另一个试用版
  7. Linux串口编程-转
  8. L3-022 地铁一日游 (30 分)-PAT 团体程序设计天梯赛 GPLT
  9. 蓝桥杯 ALGO-151 算法训练 6-2递归求二进制表示位数
  10. [Python] L1-053 电子汪-PAT团体程序设计天梯赛GPLT