题目:

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

样例解释
(1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。

HINT

N<=100000 M<=50000

Source

题解:

同样的一道三维偏序题,将删除看成倒着插入,从而得出:<插入时间,位置,大小>(<t,a,b>),对于一个组数<t,a,b>,找寻(t>t1,a>a1且b<b1)的数量加到对应的ans[t]中,注意最后将ans叠加起来;

另外要注意在排完t后,a要正着排序求一遍ans然后倒着排序一遍ans,否则ans会少加(想想为什么单纯地求逆序对不用这样)

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=1e5+;
struct node
{
int t,a,b;
}q[N],temp[N];
int n,m,tree[N],to[N],tag[N],tim;
long long ans[N];
long long Ans;
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar())
f=(f<<)+(f<<)+c-'';
return f;
}
inline bool cmp(node a,node b)
{
return a.t<b.t;
}
inline bool comp(node a,node b)
{
return a.a<b.a;
}
inline void insert(int u,int v)
{
for(int i=u;i<=n;i+=(i&(-i)))
if(tag[i]!=tim) tag[i]=tim,tree[i]=v;
else tree[i]+=v;
}
inline bool comp2(node a,node b)
{
return a.a>b.a;
}
inline int query(int u)
{
int temp=;
for(int i=u;i;i-=(i&(-i)))
if(tag[i]!=tim) continue;
else temp+=tree[i];
return temp;
}
inline void solve1(int l,int r)
{
if(l==r) return;
int mid=(l+r)/;
solve1(l,mid),solve1(mid+,r);
int i=l,j=mid+,k=l;tim++;
while(i<=mid&&j<=r)
{
if(comp(q[i],q[j]))
{
insert(q[i].b,);
temp[k++]=q[i++];
}
else
{
ans[q[j].t]+=query(n)-query(q[j].b);
temp[k++]=q[j++];
}
}
while(i<=mid) temp[k++]=q[i++];
while(j<=r)
{
ans[q[j].t]+=query(n)-query(q[j].b);
temp[k++]=q[j++];
}
for(j=l;j<=r;j++) q[j]=temp[j]; }
inline void solve2(int l,int r)
{
if(l==r) return;
int mid=(l+r)/;
solve2(l,mid),solve2(mid+,r);
int i=l,j=mid+,k=l;tim++;
while(i<=mid&&j<=r)
{
if(comp(q[j],q[i]))
{
insert(q[i].b,);
temp[k++]=q[i++];
}
else
{
ans[q[j].t]+=query(q[j].b);
temp[k++]=q[j++];
}
}
while(i<=mid) temp[k++]=q[i++];
while(j<=r)
{
ans[q[j].t]+=query(q[j].b);
temp[k++]=q[j++];
}
for(j=l;j<=r;j++) q[j]=temp[j];
}
int main()
{
#ifndef ONLINE_JUDGE
//freopen("a.in","r",stdin);
#endif
n=R(),m=R();
for(int i=;i<=n;i++)
{
q[i].a=i,q[i].b=R();
to[q[i].b]=i;
}
int Time=n,a;
for(int i=;i<=m;i++)
{
a=R();q[to[a]].t=Time--;
}
for(int i=;i<=n;i++)
if(!q[i].t) q[i].t=Time--;
sort(q+,q+n+,cmp);
solve1(,n);
sort(q+,q+n+,cmp);
solve2(,n);
for(int i=;i<=n;i++)
Ans+=ans[i];
for(int i=n;i>n-m;i--)
printf("%lld\n",Ans),Ans-=ans[i];
return ;
}

刷题总结——动态逆序对(bzoj3295)的更多相关文章

  1. 【CQOI2011】动态逆序对 BZOJ3295

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

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

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

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

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

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

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

  5. 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治

    [BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...

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

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

  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. bzoj3295 洛谷P3157、1393 动态逆序对——树套树

    题目:bzoj3295 https://www.lydsy.com/JudgeOnline/problem.php?id=3295 洛谷 P3157(同一道题) https://www.luogu.o ...

随机推荐

  1. [翻译] API测试的最佳实践 - 介绍

    API测试的最佳实践 - 介绍 在上一篇“是什么让API测试很叼”一文中,我们讨论API与其他形式的软件测试的差异.部分是因为API之间的通信压根就没考虑让你能读懂,纯粹是为了方便计算机之间的交互而设 ...

  2. 为 Azure 应用服务配置连续部署工作流

    本快速入门介绍了如何将应用服务 GitHub 集成以实现连续部署工作流.在本教程中完成的所有操作均符合1元试用条件. 本快速入门介绍了如何将应用服务 GitHub 集成以实现连续部署工作流.在本教程中 ...

  3. codevs 1008 选数

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n ...

  4. ubuntu16 安装elasticsearch6.3问题

    1.ubuntu16 安装elasticsearch6.3 elasticsearch 6.3需要的java的版本是1.8以上 安装java1.8 详见本博客的安装java https://www.c ...

  5. java 核心技术卷一笔记 6 .2接口 lambda 表达式 内部类

    6.2 接口实例 6.2.1 接口与回调 在java.swing包中有一个Timer类,可以使用它在到达给定的时间间隔时发出通告,假如程序中有一个时钟,就可以请求每秒钟获得一个通告,以便更新时钟的表盘 ...

  6. Matplotlib_常用图表

    Matplotlib绘图一般用于数据可视化 1.常用的图表有: 折线图(坐标系图) 散点图/气泡图 条形图/柱状图 饼图 直方图 箱线图 热力图 折线图(坐标系图) 折线图用于显示随时间或有序类别的变 ...

  7. (5)JSTL的xml标签库

    Jstl的XML标签库 JSTL提供了操作xml文件的标签库,使用xml标签库可以省去使用Dom和SAX标签库的繁琐,能轻松的读取xml文件的内容. <%@ taglib uri="h ...

  8. ios之UITextfield

    //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 13 ...

  9. UVa-213-信息解码

    这题的话,我们只要理解题意,应该就不算很难. 我们可以开一个二维数组,用来存放对应的编码字符,第一个下表是length,第二个下标是value,这样一来,我们在读入数据的时候就进行处理,然后想要使用的 ...

  10. python--MySQl单表查询

    一.  关键字的执行优先级(重点) from where group by having # 使用是要放在group by 后面而且前面必须有group by select distinct # 去重 ...