题目大意:

题面传送门

还是一道三维偏序题

每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间

一开始的序列看成n次插入操作

我们先求出不删除时的逆序对总数量,再统计每次删除元素时,减少的逆序对数量

然后就是三维偏序裸题了吧,第一维时间,第二维操作位置,第三维权值,用树状数组维护即可

由于逆序对可以在被删除元素的前面或者后面,所以在归并时需要正反遍历各统计一次

 #include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 150100
#define ll long long
#define dd double
#define inf 0x3f3f3f3f3f3f3f3fll
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,m,nn,K; struct node{
int p,t,x,w,ans;
}a[N1],tmp[N1]; struct BIT{
int s[N1];
void update(int x,int w){for(int i=x;i<=n;i+=(i&(-i))) s[i]+=w;}
int query(int x){int ans=; for(int i=x;i;i-=(i&(-i))) ans+=s[i]; return ans;}
}b; int que[N1],tl;
void CDQ(int L,int R)
{
if(R-L<=) return;
int M=(L+R)>>;
CDQ(L,M); CDQ(M,R);
int i,j,x,cnt; i=M-,j=R-,cnt=;
while(i>=L&&j>=M)
{
if(a[i].x>a[j].x){
b.update(a[i].w,a[i].p);
que[++tl]=i; i--;
}else{
if(a[j].p==-) a[j].ans+=b.query(a[j].w-);
j--;
}
}
while(i>=L) {i--;}
while(j>=M) {if(a[j].p==-) a[j].ans+=b.query(a[j].w-); j--;}
while(tl) {x=que[tl--]; b.update(a[x].w,-a[x].p);} i=L,j=M,cnt=;
while(i<M&&j<R)
{
if(a[i].x<a[j].x){
b.update(a[i].w,a[i].p);
que[++tl]=i; tmp[++cnt]=a[i]; i++;
}else{
if(a[j].p==-) a[j].ans+=b.query(n)-b.query(a[j].w);
tmp[++cnt]=a[j]; j++;
}
}
while(i<M) {tmp[++cnt]=a[i]; i++;}
while(j<R) {if(a[j].p==-) a[j].ans+=b.query(n)-b.query(a[j].w); tmp[++cnt]=a[j]; j++;}
while(tl) {x=que[tl--]; b.update(a[x].w,-a[x].p);} for(i=L;i<R;i++) a[i]=tmp[i-L+];
}
int cmp(node s1,node s2){
if(s1.p!=s2.p) return s1.p>s2.p;
return s1.t<s2.t;}
int pos[N1]; int main()
{
scanf("%d%d",&n,&m);
int i; ll ans=; nn=n+m;
for(i=;i<=n;i++) a[i].w=gint(),a[i].x=i,a[i].p=,a[i].t=i,pos[a[i].w]=i;
for(i=n;i>=;i--) ans+=b.query(a[i].w),b.update(a[i].w,);
memset(b.s,,sizeof(b.s));
for(i=n+;i<=n+m;i++) a[i].w=gint(),a[i].x=pos[a[i].w],a[i].p=-,a[i].t=i;
CDQ(,n+m+);
sort(a+,a+n+m+,cmp);
for(i=n+;i<=n+m;i++)
{
printf("%lld\n",ans);
ans-=a[i].ans;
}
return ;
}

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

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

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

  2. BZOJ 3295: [Cqoi2011]动态逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3865  Solved: 1298[Submit][Sta ...

  3. Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2886  Solved: 924[Submit][Stat ...

  4. BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]

    RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...

  5. 【刷题】BZOJ 3295 [Cqoi2011]动态逆序对

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

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

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

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

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

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

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

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

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

随机推荐

  1. css 垂直居中方法总结

    工作中遇到垂直居中问题,特此总结了一下几种方式与大家分享.本文讨论的垂直居中仅支持IE8+ 1.使用绝对定位垂直居中 HTML <div class="container"& ...

  2. 洛谷 P1567 统计天数

    题目背景 统计天数 题目描述 炎热的夏日,KC非常的不爽.他宁可忍受北极的寒冷,也不愿忍受厦门的夏天.最近,他开始研究天气的变化.他希望用研究的结果预测未来的天气. 经历千辛万苦,他收集了连续N(1& ...

  3. Ajax发送GET和POST请求案例

    使用ajax实现菜单联动 通常情况下,GET请求用于从服务器上获取数据,POST请求用于向服务器发送数据. 需求:选择第一个下拉框的值,根据第一个下拉框的值显示第二个下拉框的值 首先使用GET方式. ...

  4. mongodb--linux下的安装

    linux下ubuntu的安装及启动 sudo apt-get upgrade sudo apt-get udpate sudo apt-get install mongodb 用 命令查看一下mon ...

  5. Exchange EMC打开出错 解决

    Exchange控制台打开出错如何解决 1.卸载win server功能中的winrm iis 2.重启 3.安装winrm iis 4.查看default web site 有没有绑定80端口,没有 ...

  6. iOS_21团购_地图功能

    终于效果图: 右下角的回到用户位置button: MapController控制器, 是主控制器左側dock上面的[地图]button相应的控制器, 继承自ShowDealDetailControll ...

  7. android AChartEnginee解说之源代码框架解读

    从上周把android ACHartEnginee的源代码check out出来后就一直在看这个东西是怎样使用的,以及底层是怎样实现的,把近期一周对这个东西的了解先发上来,即是给自己做一个总结,也希望 ...

  8. 【Cocos2d-x】坐标系和图层

    在Cocos2D-X中,存在四种坐标系: 1.OpenGL坐标系:该坐标系原点在屏幕左下角.x轴向右,y轴向上.这也就是cocos2dx中用到的坐标系所以没啥好说的. 2.屏幕坐标系(UIKit坐标) ...

  9. 【BZOJ 2152】 聪聪可可

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2152 [算法] 点分治 [代码] #include<bits/stdc++.h ...

  10. 【转】如何在Mac 终端升级ruby版本

    原文网址:https://segmentfault.com/a/1190000003784636 rvm是什么?为什么要安装rvm呢,因为rvm可以让你拥有多个版本的Ruby,并且可以在多个版本之间自 ...