题目大意:

给定\(1\)到\(n\)的一个排列,按照给定顺序依次删除\(m\)个元素,计算每个元素删除之前整个序列的逆序对数量

基本套路:删边变加边

那么我们不就是求满足\(pos_i<pos_j,tim_i<tim_j,num_i>num_j\)的数量嘛

先按\(tim\)排序,然后归并\(pos_i\),树状数组\(num_i\)

不过这道题我们需要正反跑两个\(cdq\),因为我们需要分开统计\(pos_i<pos_j,num_i>num_j\)和\(pos_i>pos_j,num_i<num_j\)的贡献

但是我压缩到一个\(cdq\)里了\(emmmm\)

需要稍微注意的一点是,我们需要把答案累加的令一个\(ret_i\)数组中,其中\(ret_i\)表示在\(i\)时刻新产生了多少逆序对,最后还需要输出前缀和

不粘代码是不是太短了

#include<bits/stdc++.h>
using namespace std;
namespace red{
#define int long long
#define mid ((l+r)>>1)
#define lowbit(x) ((x)&(-x))
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
const int N=1e5+10;
int n,m,idx,tot;
int pos[N];
int st[N];
int ret[N];
struct point
{
int x,id,tim;
int val;
inline bool operator < (const point &t) const
{
if(tim^t.tim) return tim<t.tim;
return id<t.id;
}
}a[N<<2],t[N<<2];
int tr[N<<1];
inline void update(int x,int k)
{
for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=k;
}
inline int query(int y)
{
int ret=0;
for(int i=y;i;i-=lowbit(i))
ret+=tr[i];
return ret;
}
inline void cdq(int l,int r)
{
if(l==r) return;
cdq(l,mid);
cdq(mid+1,r);
int tl=l,tr=mid+1,tot=l;
while(tl<=mid&&tr<=r)
{
if(a[tl].id<=a[tr].id) update(a[tl].x,1),t[tot++]=a[tl++];
else ret[a[tr].tim]+=query(n)-query(a[tr].x),t[tot++]=a[tr++];
}
while(tl<=mid) update(a[tl].x,1),t[tot++]=a[tl++];
while(tr<=r) ret[a[tr].tim]+=query(n)-query(a[tr].x),t[tot++]=a[tr++];
for(int i=l;i<=mid;++i) update(a[i].x,-1);
tl=mid,tr=r;
while(tl>=l&&tr>=mid+1)
{
if(a[tl].id>=a[tr].id) update(a[tl].x,1),--tl;
else ret[a[tr].tim]+=query(a[tr].x-1),--tr;
}
while(tl>=l) update(a[tl].x,1),--tl;
while(tr>=mid+1) ret[a[tr].tim]+=query(a[tr].x-1),--tr;
for(int i=l;i<=mid;++i) update(a[i].x,-1);
for(int i=l;i<=r;++i) a[i]=t[i];
}
inline void main()
{
n=read(),m=read();
for(int x,i=1;i<=n;++i)
{
x=read();
pos[x]=i;
a[i].x=x;
a[i].id=i;
a[i].tim=1;
}
for(int x,tmp,i=1;i<=m;++i)
{
x=read();
tmp=pos[x];
a[tmp].tim=m-i+2;
}
sort(a+1,a+n+1);
cdq(1,n);
for(int i=1;i<=m+1;++i) ret[i]+=ret[i-1];
for(int i=m+1;i>=2;--i) printf("%lld\n",ret[i]);
}
}
signed main()
{
red::main();
return 0;
}

洛谷P3157 [CQOI2011]动态逆序对的更多相关文章

  1. 洛谷 P3157 [CQOI2011]动态逆序对 解题报告

    P3157 [CQOI2011]动态逆序对 题目描述 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n ...

  2. 洛谷 P3157 [CQOI2011]动态逆序对(树套树)

    题面 luogu 题解 树套树(树状数组套动态开点线段树) 静态使用树状数组求逆序对就不多说了 用线段树代替树状数组,外面套树状数组统计每个点逆序对数量 设 \(t1[i]\)为\(i\)前面有多少个 ...

  3. 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治

    题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...

  4. P3157 [CQOI2011]动态逆序对(树状数组套线段树)

    P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...

  5. P3157 [CQOI2011]动态逆序对

    P3157 [CQOI2011]动态逆序对 https://www.luogu.org/problemnew/show/P3157 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai&g ...

  6. P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)

    P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...

  7. [Luogu P3157][CQOI2011]动态逆序对 (树套树)

    题面 传送门:[CQOI2011]动态逆序对 Solution 一开始我看到pty巨神写这套题的时候,第一眼还以为是个SB题:这不直接开倒车线段树统计就完成了吗? 然后冷静思考了一分钟,猛然发现单纯的 ...

  8. luogu P3157 [CQOI2011]动态逆序对(CDQ分治)

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

  9. Luogu P3157 [CQOI2011]动态逆序对

    题目链接 \(Click\) \(Here\) 这个题有点卡常数..我的常数比较大所以是吸着氧气跑过去的... 题意:计算对于序列中每个位置\(p\),\([1,p-1]\)区间内比它大的数的个数,和 ...

随机推荐

  1. Tomcat中session复制技术

    一.准备三台机器主机的服务都正常,nginx与Tomcat构建负载均衡 主机名     IP地址 nginx       192.168.200.111 Tomcat1  192.168.200.11 ...

  2. 微信公众号开发 ,redirect_uri域名还是与后台配置不一致

    测试账号地址: https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index https ...

  3. python zip压缩文件并设置密码

    zip     -P "123" -r  app.zip         app压缩文件 密码 压缩后名称 压缩对象名称 def zipDir(dirpath, outFullNa ...

  4. MySQL变量介绍和用法简介

    目录 一.用户变量 1.1.用户变量定义 1.2.用户变量用法 二.系统变量 2.1 系统变量简单介绍 2.2 系统变量用法简介 本博客介绍一下MySQL中变量的用法和注意细节 @ 一.用户变量 1. ...

  5. Long Jumps CodeForces - 479D

    E - Long Jumps CodeForces - 479D Valery is a PE teacher at a school in Berland. Soon the students ar ...

  6. javascript解决在safari浏览器中使用history.back()返回上一页后页面不会刷新的问题

    我们知道,在JavaScript中提供了一个window.history.back()方法用于返回上一页,另外也可以使用window.history.go(-1)返回上一页(跳转). 在其他的主流浏览 ...

  7. C# read dll config

    public static SqlConnection GetSqlConnection() { Configuration myDllConfig = ConfigurationManager.Op ...

  8. 记一次asp.net core 在iis上运行抛出502.5错误

    asp.net core 在iis上运行抛出502.5异常的部分原因以及解决方案 环境说明 已安装 .net core runtime 2.1.401 已安装 .net core windows ho ...

  9. bower私服部署

    目录 bower私服部署 简介 工具清单 安装 安装nodejs 安装git 安装private-bower 配置private-bower 启动private-bower 开放端口 开机启动/注册为 ...

  10. js动态设置padding-top遇到的坑

    我想通过js动态设置元素padding-top的百分比值:以下几种都是无法设置成功的: // setAttribute设置padding-top并且转换为百分比 imageBox.setAttribu ...