Description

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

Input

输入第一行包含两个整数nm,即初始元素的个数和删除的元素个数。以下n行每行包含一个1到n之间的正整数,即初始排列。以下m行每行一个正整数,依次为每次删除的元素。
 

Output

 
输出包含m行,依次为删除每个元素之前,逆序对的个数。

Sample Input

5 4
1
5
3
4
2
5
1
4
2

Sample Output

5
2
2
1
 
各种方法都可做
 
树套树(5.9s)
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std; int n,m,l,r,o,p,num=;
long long ans=;
inline int read(){
p=;o=getchar();
while(o<''||o>'') o=getchar();
while(o>=''&&o<='') p=p*+o-,o=getchar();
return p;
}
int root[],a[],tt[];
struct tree{
int l,r,k;
tree(){
k=;
}
};
tree t[];
inline void insert(int &p,int l,int r,int k){
if (p==) p=++num;
t[p].k++;
if (l==r) return;
int mid=l+r>>;
if (k<=mid) insert(t[p].l,l,mid,k);else insert(t[p].r,mid+,r,k);
}
inline void del(int p,int l,int r,int k){
t[p].k--;
if (l==r) return;
int mid=l+r>>;
if (k<=mid) del(t[p].l,l,mid,k);else del(t[p].r,mid+,r,k);
}
inline int qui(int p,int l,int r,int k){
if (p==) return ;
if (r==k) return t[p].k;
int mid=l+r>>;
if (k<=mid) return qui(t[p].l,l,mid,k);else return qui(t[p].r,mid+,r,k)+(t[p].l==?:t[t[p].l].k);
}
inline int qua(int p,int l,int r,int k){
if (p==) return ;
if (l==k) return t[p].k;
int mid=l+r>>;
if (k<=mid) return qua(t[p].l,l,mid,k)+(t[p].r==?:t[t[p].r].k);else return qua(t[p].r,mid+,r,k);
}
inline int lo(int x){return x&(-x);}
inline void in(int i,int k){
while(i<=n){
insert(root[i],,n,k);
i+=lo(i);
}
}
inline void de(int i,int k){
while(i<=n){
del(root[i],,n,k);
i+=lo(i);
}
}
inline long long ask(int x,int k){
long long s=;
k++;
while(x>){
if (k<=n) s+=qua(root[x],,n,k);
x-=lo(x);
}
return s;
}
inline long long aski(int x,int k){
long long s=;
k--;
while(x>){
if (k>=) s+=qui(root[x],,n,k);
x-=lo(x);
}
return s;
}
int main(){
register int i,j;
n=read();
m=read();
for (i=;i<=n;i++) in(i,a[i]=read()),tt[a[i]]=i;
for (i=;i<=n;i++) ans+=ask(i,a[i]);
while(m--){
printf("%lld\n",ans);
l=read();r=tt[l];
if (a[r]==) continue;a[r]=;
ans-=ask(r,l)+aski(n,l)-aski(r,l);
de(r,l);
}
}

CDQ分治

#include<cstdio>
#include<algorithm>
using namespace std;
int read_p,read_ca,pr_num,pr_ch[];
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
inline void pr(long long k){
pr_num=;
while(k>) pr_ch[++pr_num]=k%,k/=;
while(pr_num)
putchar(pr_ch[pr_num--]+);
putchar('\n');
}
struct na{
int x,y,t;
}b[],o[],y[];
int n,m,u[],ti[],s[];
long long ans[][];
inline int low(int x){return x&(-x);} inline void add(int x){
while (x<=n){
s[x]++;
x+=low(x);
}
}
inline void del(int x){
while (x<=n){
s[x]--;
x+=low(x);
}
}
inline int ask(int x){
int ans=;
while (x>){
ans+=s[x];
x-=low(x);
}
return ans;
}
inline bool cmp(na a,na b){
if ((a.x==b.x)&&(a.y==b.y)) return a.t<b.t;
if (a.x==b.x) return a.y>b.y;
return a.x<b.x;
}
inline bool tmp(na a,na b){
if ((a.x==b.x)&&(a.y==b.y)) return a.t<b.t;
if (a.x==b.x) return a.y<b.y;
return a.x>b.x;
}
inline void work0(int l,int r){
if (l==r) return;
int mid=l+r>>,ll=l-,rr=mid;
for (register int i=l;i<=r;i++){
if (b[i].t<=mid) add(n-b[i].y+);
if (b[i].t>mid) ans[b[i].t][]+=ask(n-b[i].y+);
}
for (register int i=l;i<=r;i++)
if (b[i].t<=mid) o[++ll]=b[i];else o[++rr]=b[i];
for (register int i=l;i<=r;i++) b[i]=o[i];
for (register int i=l;i<=r;i++) if (b[i].t<=mid) del(n-b[i].y+);
work0(l,mid);work0(mid+,r);
}
inline void work1(int l,int r){
if (l==r) return;
int mid=l+r>>,ll=l-,rr=mid;
for (register int i=l;i<=r;i++){
if (y[i].t<=mid) add(y[i].y);
if (y[i].t>mid) ans[y[i].t][]+=ask(y[i].y);
}
for (register int i=l;i<=r;i++) if (y[i].t<=mid) del(y[i].y);
for (register int i=l;i<=r;i++)
if (y[i].t<=mid) o[++ll]=y[i];else o[++rr]=y[i];
for (register int i=l;i<=r;i++) y[i]=o[i];
work1(l,mid);work1(mid+,r);
}
int main(){
register int i,j=;
n=read();m=read();
for (i=;i<=n;i++) u[read()]=i;
for (i=;i<m;i++) ti[read()]=m-i;
for (i=;i<=n;i++){
if (ti[i]==) b[i].t=++j;else b[i].t=n-m+ti[i];
b[i].x=u[i];b[i].y=i;
y[i]=b[i];
}
sort(b+,b+n+,cmp);
sort(y+,y+n+,tmp);
work0(,n);work1(,n);
for (int i=;i<=n;i++) ans[i][]+=ans[i-][],ans[i][]+=ans[i-][];
for (int i=n;i>j;i--) pr(ans[i][]+ans[i][]);
}

bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)的更多相关文章

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

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

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

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

  3. bzoj 3295 [Cqoi2011]动态逆序对(cdq分治,BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3295 [题意] n个元素依次删除m个元素,求删除元素之前序列有多少个逆序对. [思路] ...

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

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

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

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

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

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

  7. BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治

    时间.位置.数字为三个属性. 排序时间,CDQ位置,树状数组处理数字即可. #include <cstdio> #include <cstring> #include < ...

  8. 【Bzoj 3295】 动态逆序对(树套树|CDQ分治)

    [题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状 ...

  9. 【BZOJ】3295: [Cqoi2011]动态逆序对

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3295 mamaya,弱鸡xrdog终于会写树套树啦.... 将树状数组中每一个节点看成一棵 ...

随机推荐

  1. 为了CET-4!(二)

    directions: For this part,you are allowed 30 minutes to write an eassay.Suppose there are two option ...

  2. 文档对象模型(DOM),你只需知道这些就够了!

    官方定义--应用程序编程接口(API) 文档对象模型是用于HTML和XML文档的应用程序编程接口,它定义文档的逻辑结构,以及访问和操作文档的方式. "The Document Object ...

  3. js构建函数,点击按钮显示div,再点击按钮或其他区域,隐藏div

    这只是一个例子,先看看效果: html代码: <nav> <span class="nav_logo"></span> <h1>云蚂 ...

  4. Java中静态代码块、构造代码块、构造函数、普通代码块

    在Java中,静态代码块.构造代码块.构造函数.普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序. 1.静态代码块 ①.格式 在java类中(方法中不能存在静态代 ...

  5. 关于vs2010下水晶报表的使用入门

    关于vs2010下使用水晶报表了解情况记录如下: 1.首先vs2010不再自带水晶报表控件了,需要下载安装vs2010配套的水晶报表控件:CRforVS_13_0.这个控件安装很简单,基本上都选择默认 ...

  6. 5、员工上班时间的问题 - CEO之公司管理经验谈

    员工上班时间一般是根据公司的规章制度来制定的.当然,在不同的地点也有不同的做法.比如北京.上海.广州.深圳这些重点的大点的城市,加班的时间就相对比较多一些.但是按照笔者的想法,一般是一天7-8小时工作 ...

  7. SLAM入门之视觉里程计(4):基础矩阵的估计

    在上篇文章中,介绍了三位场景中的同一个三维点在不同视角下的像点存在着一种约束关系:对极约束,基础矩阵是这种约束关系的代数表示,并且这种约束关系独立与场景的结构,只依赖与相机的内参和外参(相对位姿).这 ...

  8. CentOS下LAMP环境安装配置

    本来几下yum都能装好的,yum却出问题了,报错:AttributeError: 'YumBaseCli' object has no attribute '_not_found_i',可能是某个文件 ...

  9. 【JDK1.8】JDK1.8集合源码阅读——LinkedList

    一.前言 这次我们来看一下常见的List中的第二个--LinkedList,在前面分析ArrayList的时候,我们提到,LinkedList是链表的结构,其实它跟我们在分析map的时候讲到的Link ...

  10. 使用Template格式化Python字符串

    对Python字符串,除了比较老旧的%,以及用来替换掉%的format,及在python 3.6中加入的f这三种格式化方法以外,还有可以使用Template对象来进行格式化. from string ...