news 2026/4/23 13:27:22

《P3157 [CQOI2011] 动态逆序对》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《P3157 [CQOI2011] 动态逆序对》

题目描述

对于序列 a,它的逆序对数定义为集合

{(i,j)∣i<j∧ai​>aj​}

中的元素个数。

现在给出 1∼n 的一个排列,按照某种顺序依次删除 m 个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。

输入格式

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

输出格式

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

输入输出样例

输入 #1复制

5 4 1 5 3 4 2 5 1 4 2

输出 #1复制

5 2 2 1

说明/提示

【数据范围】
对于 100% 的数据,1≤n≤105,1≤m≤50000。

【样例解释】
删除每个元素之前的序列依次为:

1,5,3,4,21,3,4,23,4,23,2

代码实现:

#include <cstdio> #include <algorithm> #define lowbit(x) ((x)&(-x)) #define N 150010 #define ll long long using namespace std; struct nd{ int id, x, y; nd(){} nd(int a, int b, int c):id(a), x(b), y(c){} friend bool operator <(nd a, nd b){return (a.x==b.x)?a.y<b.y:a.x<b.x;} }A[N], tmp[N]; int n, m, pos[N]; ll res[N]; inline int rd(){ int x=0, f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } namespace bit{ int tr[N]; inline void upd(int x, int v){for(;x<=n;x+=lowbit(x))tr[x]+=v;} inline int qry(int x){int s=0;for(;x;x-=lowbit(x))s+=tr[x];return s;} inline void clr(int x){for(;x<=n&&tr[x];x+=lowbit(x))tr[x]=0;} } void cdq(int l, int r){ if(l==r) return; int mid=(l+r)>>1; cdq(l, mid), cdq(mid+1, r); for(int p=l, q=mid+1, cnt=l;p<=mid||q<=r;) if(q>r||p<=mid&&A[p]<A[q]) bit::upd(A[p].y, 1), tmp[cnt++]=A[p++]; else res[A[q].id]+=bit::qry(n)-bit::qry(A[q].y), tmp[cnt++]=A[q++]; for(int i=l;i<=mid;++i) bit::clr(A[i].y); for(int i=l;i<=r;++i) A[i]=tmp[i]; for(int i=r;i>=l;--i) if(A[i].id<=mid) bit::upd(A[i].y, 1); else res[A[i].id]+=bit::qry(A[i].y); for(int i=l;i<=r;++i) bit::clr(A[i].y); } bool cmp_id(nd a, nd b){return a.id<b.id;} int main(){ n=rd(), m=rd(); for(int i=1, x;i<=n;++i) pos[x=rd()]=i, A[i]=nd(0, i, x); int tim=n; for(int i=1, x;i<=m;++i) A[pos[rd()]].id=tim--; for(int i=1;i<=n;++i) if(!A[i].id) A[i].id=tim--; sort(A+1, A+n+1, cmp_id); cdq(1, n); for(int i=1;i<=n;++i) res[i]+=res[i-1]; for(int i=n;i>=n-m+1;--i) printf("%lld\n", res[i]); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 13:03:29

基于html的书城阅读器系统的设计与实现(源码+论文+部署+安装)

感兴趣的可以先收藏起来&#xff0c;还有在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望可以帮到大家。 一、程序背景 随着信息技术和移动互联网的迅猛发展&#xff0c;数字阅读已成为主流知识获取方式。传统…

作者头像 李华
网站建设 2026/4/23 13:03:33

保姆级Windows版宝塔面板搭建教程:新手也能轻松上手运维

作为一名长期和服务器打交道的开发者&#xff0c;我深知新手配置Windows服务器环境的痛苦——手动安装IIS、PHP、MySQL&#xff0c;光是解决各种依赖冲突和端口占用问题&#xff0c;就能耗掉大半天时间。而宝塔面板的出现&#xff0c;直接把复杂的运维操作变成了"点点点&q…

作者头像 李华
网站建设 2026/4/18 16:38:12

Python 绘制动态跳动爱心|情人节专属浪漫代码,新手零基础也能上手

马上就是情人节&#xff0c;程序员的浪漫从一行行代码开始&#xff01;今天分享一款纯 Python 内置库实现的动态跳动爱心&#xff0c;无需复杂第三方依赖&#xff0c;黑色背景搭配粒子化爱心&#xff0c;自带自然的跳动节奏和柔和光晕&#xff0c;既适合送给心仪的人制造惊喜&a…

作者头像 李华
网站建设 2026/4/17 13:17:08

C++基于微服务脚手架的视频点播系统---客户端(3)

这是即时通讯系统开发实战的第三篇技术指南。在前两篇中&#xff0c;我们完成了项目架构设计、环境搭建、启动页开发以及主窗口的基础外观定制&#xff08;去边框、加阴影&#xff09;。本篇将深入探讨客户端界面的布局策略&#xff0c;剖析 Qt 布局系统的核心机制&#xff0c;…

作者头像 李华
网站建设 2026/4/21 10:56:55

数字孪生解决方案推荐哪家?实战案例解析

数字孪生——这个听起来有点科幻的词&#xff0c;其实早已悄悄潜入我们现实世界的各个角落。它远不止是三维建模或者虚拟仿真那么简单&#xff0c;更像是以数据为血脉、模型为骨架、智能为神经的“数字生命体”&#xff0c;在虚拟空间中持续生长&#xff0c;与现实物体同步呼吸…

作者头像 李华