题意:动态逆序对,共m次删除操作,求每次操作前的逆序对个数

删除操作转换为添加操作,首先对时间a进行简单排序

然后用cdq分治处理b维,树状数组处理c维

此时需要求的是对于某有序组\((a,b,c)\)

求多少个\((a_i,b_i,c_i)\)满足

\(a_i<a,b_i<b,c_i>c\)

\(a_i<a,b_i>b,c_i<c\)

为了方便起见可把某一维度的空间倒转,把编号\(b_k\)或\(c_k\)换成\(n-b_k+1\)或\(n-c_k+1\)

那么两次cdq分治可以表示为求

\(a_i<a,b_i<b,c_i<c\)

以及

\(a_i<a,b_i<b,c_i<c\)

注意一下倒序操作的编号

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rrep(i,j,k) for(int i=j;i>=k;i--)
#define erep(i,u) for(int i=head[u];~i;i=nxt[i])
#define print(a) printf("%lld",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
using namespace std;
const int MAXN = 1e5+11;
const int MOD = 1e9+7;
typedef long long ll;
ll read(){
ll x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct QUERY{
int a,b,c;
bool operator < (const QUERY &rhs) const{
if(b!=rhs.b) return b<rhs.b;
return c<rhs.c;
}
}Q[MAXN],tmp[MAXN];
bool cmp(QUERY a,QUERY b){
if(a.a!=b.a) return a.a<b.a;
if(a.b!=b.b) return a.b<b.b;
return a.c<b.c;
}
int S,W,n,m;
ll ans[MAXN];
struct FT{
ll ft[MAXN];
inline int lowbit(int x){return x&-x;}
void update(int k,int v){
while(k<MAXN){
ft[k]+=v;
k+=lowbit(k);
}
}
int query(int k){
int res=0;
while(k>0){
res+=ft[k];
k-=lowbit(k);
}
return res;
}
void clear(int k){
while(k<MAXN){
if(ft[k]){
ft[k]=0;
}else{
break;
}
k+=lowbit(k);
}
}
void init(){
memset(ft,0,sizeof ft);
}
}ft;
void solve(int l,int r){
if(l==r) return;
int mid=l+r>>1;
solve(l,mid);
solve(mid+1,r);
int p=l,q=mid+1,cnt=0;
while(p<=mid&&q<=r){
if(Q[p].b<Q[q].b){
ft.update(Q[p].c,1);
tmp[++cnt]=Q[p++];
}else{
ans[Q[q].a]+=ft.query(Q[q].c);
tmp[++cnt]=Q[q++];
}
}
while(p<=mid) tmp[++cnt]=Q[p++];
while(q<=r){
ans[Q[q].a]+=ft.query(Q[q].c);
tmp[++cnt]=Q[q++];
}
rep(i,l,p-1) ft.clear(Q[i].c);
rep(i,1,cnt) Q[i+l-1]=tmp[i];
}
int ord[MAXN];
int main(){
while(cin>>n>>m){
int cnt=0,t=n;
rep(i,1,n){
int x=read();
Q[++cnt].a=0;
Q[cnt].b=i;
Q[cnt].c=x;
}
memset(ord,0,sizeof ord);
rep(i,1,m){
int x=read();
ord[x]=i;
}
int tt=m;
rep(i,1,n) if(ord[i]==0) ord[i]=++tt;
rep(i,1,n) Q[i].a=n-ord[Q[i].c]+1; //转换为添加时间
rep(i,1,n) Q[i].c=n-Q[i].c+1;
sort(Q+1,Q+1+cnt,cmp);
ft.init();
solve(1,cnt);
rep(i,1,n){
Q[i].c=n-Q[i].c+1;
Q[i].b=n-Q[i].b+1;
}
sort(Q+1,Q+1+cnt,cmp);
ft.init();
solve(1,cnt);
//1...n-m为初态 n-m+1...n为删除过程
rep(i,1,n) ans[i]+=ans[i-1];
rrep(i,n,n-m+1) println(ans[i]);
}
return 0;
}

BZOJ - 3295 三维偏序 空间转换的更多相关文章

  1. BZOJ - 3263 三维偏序

    题意:定义元素为有序组(a,b,c),若存在x组(a_i,b_i,c_i)分别小于等于(a,b,c),则该元素的等级为x,求[0,n-1]等级的个数 cdq分治练手题,对a简单排序并去重,对b进行分治 ...

  2. BZOJ 3295:[Cqoi2011]动态逆序对(三维偏序 CDQ分治+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 题意:简单明了. 思路:终于好像有点明白CDQ分治处理三维偏序了.把删除操作看作是插入操作,那 ...

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

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

  4. Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治

    Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...

  5. BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]

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

  6. [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解

    原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...

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

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

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

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

  9. BZOJ 2244 [SDOI2011]拦截导弹 (三维偏序CDQ+线段树)

    题目大意: 洛谷传送门 不愧为SDOI的duliu题 第一问?二元组的最长不上升子序列长度?裸的三维偏序问题,直接上$CDQ$ 由于是不上升,需要查询某一范围的最大值,并不是前缀最大值,建议用线段树实 ...

随机推荐

  1. JVM致命错误日志(hs_err_pid.log)解读

    JVM致命错误日志(hs_err_pid.log)解读 摘自:https://blog.csdn.net/u013938484/article/details/51811400 2016年07月02日 ...

  2. Redis初学笔记

    1.官网概述 Redis is an open source (BSD licensed), in-memory data structure store, used as database, cac ...

  3. Linux下软件常见安装方式

    pasting  分类: Linux2007-12-08 16:31 1909人阅读 评论(0) 收藏 举报 linuxredhat脚本文档managerfile        Linux下软件安装主 ...

  4. 为啥final类型的map或者arraylist可以修改数据 而final类型的String变量不可以修改数据呢

    比如 final   Map  map =new  HashMap();    可以往map里put数据final   List  list =new  ArrayList();   可以往list里 ...

  5. Grails项目开发——前端请求跨域问题

    Grails项目开发--前端请求跨域问题 最近做项目采用前后端分离的思想,使用Grails作为后台开发Restful API供前端调用. 在项目开发的过程中,遇到前端没办法通过ajax访问到后台接口的 ...

  6. SpringCloud教程 | 第四篇:断路器(Hystrix)(Finchley版本)

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务 ...

  7. 记一次阿里云linux病毒清理过程

    1.起因   因为这台服务器是我们公司内部开发服务器,几乎每个人都有root密码.在两天前突然有同事反馈说偶尔会有ssh连不上,git代码无法提交的问题,刚开始也没有在意,以为是阿里云服务器网络波动的 ...

  8. Tomcat version 6.0 only supports J2EE 1.2 ......

    在project的.setting folder下面,有个名为org.eclipse.wst.common.project.facet.core.xml的文件,里面配置有各种版本信息.此时,按照本机配 ...

  9. Delphi 中调用JS文件中的方法

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  10. c# 与 Mysql 的通讯方式总结

    两种开发方式 1.使用 vs 自带的可视化工具,不推荐. 在 vs 的项目中添加 ‘数据集’,然后通过可视化的工具添加数据库为数据源,默认可添加 SQL Server 和 Oracle 等,添加 My ...