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

思路:

可以将这道题看成倒着插入,这样就可以转化成求逆序对数,用CDQ分治降维,正反用树状数组求两遍逆序对就好了。

这道题还可以用在线的树套树或者可持久化线段树来写。。

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M = 2e5+;
struct node{
int t,x,y;
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 y<k.y;
return x < k.x;
}
};
int n,m,a[M],pos[M],x,c[M],tim,len;
node q[M],t[M];
ll ans[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 = l;i <= r;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%d",&n,&m);
for(int i = ;i <= n;i ++){
scanf("%d",&a[i]);
pos[a[i]] = i; q[++len] = node(++tim,i,a[i],,);
}
for(int i = ;i <= m;i ++){
scanf("%d",&x);
q[++len] = node(++tim,pos[x],x,-,i);
}
sort(q+,q++len);
cdq(,len);
for(int i = ;i <= m;i ++){
ans[i] += ans[i-];
printf("%lld\n",ans[i-]);
}
return ;
}

bzoj 3295 动态逆序对 (三维偏序,CDQ+树状数组)的更多相关文章

  1. BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)

    题目大意: 题面传送门 还是一道三维偏序题 每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间 一开始的序列看成n次插入操作 我们先求出不删除时的逆序对总数 ...

  2. BZOJ 2141 排队 (三维偏序CDQ+树状数组)

    题目大意:略 洛谷传送门 和 [CQOI2015]动态逆序对 这道题一样的思路 一开始的序列视为$n$次插入操作 把每次交换操作看成四次操作,删除$x$,删除$y$,加入$x$,加入$y$ 把每次操作 ...

  3. BZOJ 2716/2648 SJY摆棋子 (三维偏序CDQ+树状数组)

    题目大意: 洛谷传送门 这明明是一道KD-Tree,CDQ分治是TLE的做法 化简式子,$|x1-x2|-|y1-y2|=(x1+y1)-(x2+y2)$ 而$CDQ$分治只能解决$x1 \leq x ...

  4. BZOJ 1176/2683 Mokia (三维偏序CDQ+树状数组)

    题目大意: 洛谷传送门 三维偏序裸题.. 每次操作都看成一个三元组$<x,y,t>$,表示$x,y$坐标和操作时间$t $ 询问操作拆成$4$个容斥 接下来就是$CDQ$了,外层按t排序, ...

  5. BZOJ 3262 陌上花开 (三维偏序CDQ+树状数组)

    题目大意: 题面传送门 三维偏序裸题 首先,把三元组关于$a_{i}$排序 然后开始$CDQ$分治,回溯后按$b_{i}$排序 现在要处理左侧对右侧的影响了,显然现在左侧三元组的$a_{i}$都小于等 ...

  6. 洛谷P3810-陌上开花(三维偏序, CDQ, 树状数组)

    链接: https://www.luogu.org/problem/P3810#submit 题意: 一个元素三个属性, x, y, z, 给定求f(b) = {ax <= bx, ay < ...

  7. BZOJ 3295 动态逆序对 | CDQ分治

    BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...

  8. bzoj 3295 动态逆序对 CDQ分支

    容易看出ans[i]=ans[i-1]-q[i],q[i]为删去第i个数减少的逆序对. 先用树状数组算出最开始的逆序对,预处理出每个数前边比它大的和后边比它小的,就求出了q[i]的初始值. 设b[i] ...

  9. 洛谷 P1908 逆序对 Label:归并排序||树状数组 不懂

    题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...

随机推荐

  1. HDMI传输原理:TMDS

    参考资料:http://blog.sina.com.cn/s/blog_679686370100vgg1.html: http://www.eeworld.com.cn/mndz/2011/0818/ ...

  2. 认识Python&基础环境搭建

    前言 作为.NET Coder可能.NET Core是现阶段首要学习方向,但是说实在的对Core真的不感冒. 原因有几点: 1.公司项目底层需要的一部分库,Core还不支持. 2.同样的需求,.NET ...

  3. 【Java并发.1】简介

    继上一本<深入理解Java虚拟机>之后,学习计划里的另一本书<Java并发编程实战>现在开始学习,并记录学习笔记. 第一章主要内容是介绍 并发 的简介.发展.特点. 编写正确的 ...

  4. 关于树莓派HDMI转VGA线接显示器黑屏

    经过数种折腾,找到了解决方法,在SD卡内有个config.txt文件,在其中找到“#hdmi_safe=1”,把#消除掉,变更后成为 # uncomment if you get no picture ...

  5. 2018年高教社杯全国大学生数学建模竞赛A题解题思路

    题目 先贴一下A的题目吧 A题   高温作业专用服装设计 在高温环境下工作时,人们需要穿着专用服装以避免灼伤.专用服装通常由三层织物材料构成,记为I.II.III层,其中I层与外界环境接触,III层与 ...

  6. 深入理解USB流量数据包的抓取与分析

    0x01 问题提出 在一次演练中,我们通过wireshark抓取了一个如下的数据包,我们如何对其进行分析? 0x02 问题分析 流量包是如何捕获的? 首先我们从上面的数据包分析可以知道,这是个USB的 ...

  7. .apply()用法和call()的区别

    Js apply方法详解我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里 ...

  8. Beta阶段爬取数目预估

    预计于12月29号能进行Beta版本发布. Beta阶段我们的爬取动作应该更有针对性,在爬取期间如若数据处理小组有需求,会优先爬取数据处理小组提供的种子链接.预估在项目展示之前能够爬取的数目: 普通网 ...

  9. Linux内核分析(第九周)

    第一周总结1.存储程序计算机 + 函数调用堆栈 + 中断机制 2.堆栈:C语言程序运行时候必须的一个记录调用路径和参数的空间(函数调用框架/提供局部变量/传递参数/保存返回地址) 不同指令可能实现相同 ...

  10. LINUX第三次实践:程序破解

    LINUX第三次实践:程序破解 标签(空格分隔): 20135328陈都 一.掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即"空指令".执行到NOP ...