bzoj3295: [Cqoi2011]动态逆序对(树套树)
#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]动态逆序对(树套树)的更多相关文章
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)
3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...
- [bzoj3295][Cqoi2011]动态逆序对_主席树
动态逆序对 bzoj-3295 Cqoi-2011 题目大意:题目链接. 注释:略. 想法:直接建立主席树. 由于是一个一个删除,所以我们先拿建立好的root[n]的权值线段树先把总逆序对求出来,接着 ...
- 【BZOJ3295】动态逆序对(线段树,树状数组)
[BZOJ3295]动态逆序对(线段树,树状数组) 题面 Description 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的 ...
- BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组
BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一 ...
- bzoj3295[Cqoi2011]动态逆序对 树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5987 Solved: 2080[Submit][Sta ...
- BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7465 Solved: 2662[Submit][Sta ...
- bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...
- 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)
3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...
- bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...
随机推荐
- java多线程系类:基础篇:10生产者消费者的问题
概要 本章,会对"生产/消费者问题"进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skyw ...
- &11,散列表
#1,是什么? 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个 ...
- swift 动手写网络请求封装(仿照了一个大神的)不用导入第三方
新建一个类Network import UIKit //NSURLSession 的使用过程: // //构造 NSURLRequest //确定 URL //确定 HTTP 方法(GET.POST ...
- 理解JavaScript的作用域链
上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现. 本文就看看Exec ...
- LiveSDK初始化/登录时失败的解决办法
环境描述 Windows 8.1+VS 2013 Update3+Live SDK 5.6 Metro风格的程序,集成LIVE认证 问题描述 如下图,提示Null Reference的异常. 解决办法 ...
- [Offer收割]编程练习赛5-1 小Ho的防护盾
#1357 : 小Ho的防护盾 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho的虚拟城市正在遭受小Hi的攻击,小Hi用来攻击小Ho城市的武器是一艘歼星舰,这艘歼星 ...
- jQuery——$(function(){});与$(document).ready(function(){});的区别
只要在我们的jsp页面中写上 <script> $(function(){ //内容 }); </script> 则,函数中的内容就会在jsp页面被载入的时候就被执行,实际上, ...
- Mybatis学习--Mapper.xml映射文件
简介 Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 映射文件中有很多属性,常用的就是parameterType(输入类型 ...
- SwipeRefreshLayout 首次打开出现加载图标
最近要实现如何如图效果: 主要是在初始化,代码如下: , getResources().getDimensionPixelSize(typed_value.resourceId)); refre ...
- curl operate elasticsearch
export elasticsearchwebaddress=localhost:9200# 1. Add documentcurl -X PUT "$elasticsearchwebadd ...