链接: 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+;
int c[M<<],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 = ;
while(x){
sum += c[x];
x -= (x&-x);
}
return sum;
} 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].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-));
}
for(int i = r;i >= l;i --)
if(q[i].t <= mid) add(q[i].y,-q[i].kind); int L = l,R = mid+;
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+,r);
} int main()
{
scanf("%d",&n);
for(int i = ;i <= n;i ++){
scanf("%d",&a[i]);
b[i] = a[i];
}
int cnt = ;
sort(b+,b++n);
int len = unique(b+,b++n)-b-;
for(int i = ;i <= n;i ++){
a[i] = lower_bound(b+,b+len+,a[i])-b;
q[++cnt] = node(cnt,i,a[i],,);
}
scanf("%d",&m);
for(int i = ;i <= m;i ++){
int x,y;
scanf("%d%d",&x,&y);
q[++cnt] = node(cnt,x,a[y],,i);
q[++cnt] = node(cnt,x,a[x],-,i);
q[++cnt] = node(cnt,y,a[x],,i);
q[++cnt] = node(cnt,y,a[y],-,i);
swap(a[x],a[y]);
}
sort(q+,q+cnt+);
cdq(,cnt);
printf("%d\n",ans[]);
for(int i = ;i <= m;i ++){
ans[i] += ans[i-];
}
for(int i = ;i <= m;i ++)
printf("%d\n",ans[i]);
}

bzoj 2141 : 排队 (cdq分治+bit)的更多相关文章

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

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

  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. odoo 装饰器用法@api

    摘自:blog.csdn.net/cmzhuang/article/details/52932883 @api.one one装饰符自动遍历记录集,把self重新定义成当前记录.注意,返回值是一个li ...

  2. Vue-嵌套路由

    一个被渲染组件同样可以包含自己的嵌套 <router-view>.同样要有vue-router的三个要素:路由map .路由视图.路由导航. 举个在"/apple" 下 ...

  3. Codeforces Round #481 (Div. 3)

    我实在是因为无聊至极来写Div3题解 感觉我主要的作用也就是翻译一下题目 第一次线上打CF的比赛,手速很重要. 这次由于所有题目都是1A,所以罚时还可以. 下面开始讲题 A.Remove Duplic ...

  4. 【转】Git版本控制软件从入门到精通学习手册

    GIT 学习手册简介 本站为 Git 学习参考手册.目的是为学习与记忆 Git 使用中最重要.最普遍的命令提供快速翻阅. 这些命令以你可能需要的操作类型划分,并且将提供日常使用中需要的一些常用的命令以 ...

  5. 【下一代核心技术DevOps】:(四)私有镜像库阿里云Docker服务使用

    1.使用阿里云镜像库有很多优点 稳定可靠,阿里技术,放心使用. 国内cdn多节点加速,下载速度非常快 可以和阿里云Git代码集成,不需要第三方CI工具,当然带的自动构建服务也可以和其他的Git库集成, ...

  6. Ionic 3 延迟加载(Lazy Load)实战(一)

    本文分享并演示了在 Ionic 3 框架中如何进行模块的延迟加载(Lazy Load)开发. 在我的实战课程「快速上手Ionic3 多平台开发企业级问答社区」中,因为开发的仿知乎 App 模块间的加载 ...

  7. Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

    众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 一 ...

  8. 常用rsync命令操作梳理

    作为一个运维工程师,经常可能会面对几十台.几百台甚至上千台服务器,除了批量操作外,环境同步.数据同步也是必不可少的技能.说到“同步”,不得不提的利器就是rsync.rsync不但可以在本机进行文件同步 ...

  9. Redis常用操作--------SortedSet(有序集合)

    1.ZADD key score member [[score member] [score member] ...] 将一个或多个 member 元素及其 score 值加入到有序集 key 当中. ...

  10. doc窗口 输入命令net start mysql 服务名无效

    解决方案: 1.win+R键输入cmd敲回车进入dos界面: 2.输入cd d:/mysql-5.5.25/bin敲回车,发现没变化: 3.输入d:敲回车,定位到d:\mysql-5.5.25\bin ...