#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 100005
#define maxk 6000005
using namespace std; int n,m,size,num[maxn],pos[maxn],tsum[maxn],t1[maxn],t2[maxn];
typedef long long ll;
ll ans;
int sum[maxk],lc[maxk],rc[maxk],root[maxn]; int lowbit(int x){
return x&(-x);
} void tree_insert(int x){
for (int i=x;i<=n;i+=lowbit(i)) tsum[i]++;
} int tree_sum(int x){
int temp=;
for (int i=x;i>;i-=lowbit(i)) temp+=tsum[i];
return temp;
} int query_sum(int k,int l,int r,int x,int y){
if (!k) return ;
if (l>=x&&r<=y){
return sum[k];
}
int mid=(l+r)/,temp=;
if (x<=mid) temp+=query_sum(lc[k],l,mid,x,y);
if (y>mid) temp+=query_sum(rc[k],mid+,r,x,y);
return temp;
} int query(int lim,int l,int r){
int temp=;
for (int i=lim;i>;i-=lowbit(i)){
temp+=query_sum(root[i],,n,l,r);
}
return temp;
} void update(int &k,int l,int r,int x){
if (!k) k=++size;
sum[k]++;
if (l==r) return;
int mid=(l+r)/;
if (x<=mid) update(lc[k],l,mid,x);
else update(rc[k],mid+,r,x);
} void insert(int lim,int x){
for (int i=lim;i<=n;i+=lowbit(i)){
update(root[i],,n,x);
}
} int main(){
// freopen("dtnxd.in","r",stdin);
// freopen("dtnxd.out","w",stdout);
scanf("%d%d",&n,&m),ans=size=;
memset(sum,,sizeof(sum));
memset(root,,sizeof(root));
memset(tsum,,sizeof(tsum));
for (int i=;i<=n;i++){
scanf("%d",&num[i]),pos[num[i]]=i;
t1[i]=tree_sum(n)-tree_sum(num[i]);
ans+=t1[i];
tree_insert(num[i]);
}
memset(tsum,,sizeof(tsum));
for (int i=n;i>=;i--){
t2[i]=tree_sum(num[i]-);
tree_insert(num[i]);
}
memset(tsum,,sizeof(tsum));
// for (int i=1;i<=n;i++) printf("%d %d\n",t1[i],t2[i]);
int u,v;
for (int i=;i<=m;i++){
scanf("%d",&u),v=pos[u];
printf("%lld\n",ans);
ans-=(t1[v]+t2[v]);
ans+=query(v-,u+,n);
ans+=query(n,,u-);
ans-=query(v,,u-);
insert(v,u);
}
return ;
}

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3295

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

做法:一种暴力写法,就是每次删除前,重新用树状数组维护逆序对,复杂度mnlogn,是接受不了的。我们考虑每次删除一个数后对ans的影响,其影响就是ans-=前面未被删除的数中比它大的个数+后面未被删除的数中比它小的数的个数。这是一个经典的问题:询问一段区间l~r中权值在x~y范围内的个数,支持修改操作,我们能想到的便是树状数组套动态开点的权值线段树(可持久化线段树),但是恶心的是这题卡空间,我们可以这样优化一下:

我们用一维树状数组即可预处理出两个数组,t1[],t2[],分别表示初始序列中在i之前的比它大的个数、初始序列中在i之后的比它小的个数,我们就不需要把初始的n个数也加进树套树中了,我们删除一个数,ans-=(t1+t2-在它之前的已被删除的比它大的个数-在它之后已被删除的比它小的个数),我们便只需要将m个数加入到树套树中了,空间复杂度优化了不少,mlogn^2,不会MLE。

还有一种cdq分治的写法,用的归并排序的思想,以后再写吧。

树套树。

bzoj3295: [Cqoi2011]动态逆序对(树套树)的更多相关文章

  1. [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...

  2. bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)

    3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...

  3. [bzoj3295][Cqoi2011]动态逆序对_主席树

    动态逆序对 bzoj-3295 Cqoi-2011 题目大意:题目链接. 注释:略. 想法:直接建立主席树. 由于是一个一个删除,所以我们先拿建立好的root[n]的权值线段树先把总逆序对求出来,接着 ...

  4. 【BZOJ3295】动态逆序对(线段树,树状数组)

    [BZOJ3295]动态逆序对(线段树,树状数组) 题面 Description 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的 ...

  5. BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组

    BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一 ...

  6. bzoj3295[Cqoi2011]动态逆序对 树套树

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

  7. BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)

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

  8. bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组

    [bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...

  9. 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)

    3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...

  10. bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...

随机推荐

  1. Windows Server 2008 R2中的ASP.NET环境架设

    .NET Framework的部分功能在Windows Server 2008 R2得到支持,包括:.NET 2/3/3.5的子集和ASP.NET.另外,PowerShell也在Server Core ...

  2. Swagger 增加 DocumentFilter 隐藏不需要显示的接口

    services.ConfigureSwaggerGen(options => { options.SingleApiVersion(new Info { Version = "v1& ...

  3. .NET Core)的ZooKeeper异步客户端

    支持断线重连.永久watcher.递归操作并且能跨平台(.NET Core)的ZooKeeper异步客户端   阅读目录 什么是ZooKeeper? 项目介绍 提供的功能 使用说明 FAQ 在公司内部 ...

  4. Method not found: '!!0[] System.Array.Empty()'.

    错误原因:程序里面没有可调用的方法(程序使用的是 .NET Framework 4.6,但是你自己的系统里面使用的不是 4.6版本) 解决方法:1.安装window sp1  ,下载地址是:https ...

  5. [转] EJB 3和Spring技术体系比较

    最近在学习EJB 3,对于SSH与EJB3,一直不太明白“即生瑜,何生亮?”,今天无意看到一篇旧文,比较系统的对比了这二种技术架构,转载于此: 原文出处:http://www.51cto.com/sp ...

  6. 实验一 Java开发环境的熟悉

    实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没 ...

  7. Java实现生产者和消费者

    生产者和消费者问题是操作系统的经典问题,在实际工作中也常会用到,主要的难点在于协调生产者和消费者,因为生产者的个数和消费者的个数不确定,而生产者的生成速度与消费者的消费速度也不一样,同时还要实现生产者 ...

  8. JQuery实现资讯上下滚动悬停效果

    第一步:使用repeater绑定一个table. <table width="530" id="rollBar"> <asp:Repeater ...

  9. rar 命令

    1 wger http://www.rarlab.com/rar/rarlinux-3.9.2.tar.gz 下载文件包 会下载在当前目录 2 cp xxx.xxx ../ 复制xxx.xxx到上个目 ...

  10. SSH框架 sequence diagram