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 权值大小 ...
随机推荐
- 小tips: 使用 等空格实现最小成本中文对齐
一.重见天日第二春 11年的时候,写了篇文章“web页面相关的一些常见可用字符介绍”,这篇文章里面藏了个好东西,就是使用一些空格实现个数不等的中文对齐或等宽.见下表: 字符以及HTML实体 描述以及说 ...
- TinyFrame开篇:基于CodeFirst的ORM
前言 做项目的这段时间,由于比较忙,一直没有机会闲下来思考.正好趁目前手头活儿轻松点,就花了一两天时间搭建了一个比较简单的框架,名称暂时就叫做:TinyFrame吧.顾名思义,就是微框架的意思.虽然这 ...
- 用 Smarty 生成静态页面入门介绍
why Smarty? 随着公司首页(以下简称首页)流量越来越大,最近开始考虑使用后台语言生成静态页面的技术. 我们知道,一个简单页面一般是一个 .html(或者 .htm ..shtml)后缀的文件 ...
- SQL基础之数据库
1.基础概念 首先要强调一点,就是我们的数据库是由数据库系统来管理的,我们登入数据库并在其上进行操作时最终均要通过数据库系统来完成.可以理解成在数据库上进行操作的是客户端,数据库系统是服务端.一个数据 ...
- 关于BOM
BOM:浏览器对象模型 (Browser Object Model)主要定义的是JS操作浏览器的方法和属性. 大部分方法都在window下. 常用方法:(JS里面规定如果方法前面是window,win ...
- [CF#250 Div.2 D]The Child and Zoo(并查集)
题目:http://codeforces.com/problemset/problem/437/D 题意:有n个点,m条边的无向图,保证所有点都能互通,n,m<=10^5 每个点都有权值,每条边 ...
- js实现登陆页面的拖拽功能
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>登 ...
- MySql数据类型问题
1. mysql时间函数 DATE_ADD(now(), INTERVAL 1 DAY) AS tomorrow DATE_SUB(now(), INTERVAL 1 DAY) AS yesterda ...
- [转]Eclipse中的Web项目自动部署到Tomcat
原文地址:http://www.cnblogs.com/ywl925/p/3815173.html 原因 很长时间没用Eclipse了,近期由于又要用它做个简单的JSP项目,又要重新学习了,虽然熟悉的 ...
- iOS开发-- 利用AVPlayer播放远程音乐和视频
一.简单的播放音乐和视频,播放视频的工具栏需要自己写 二.利用老师封装的框架实现视频播放 链接:http://pan.baidu.com/s/1hrEKlus 密码:8e7g