news 2026/4/16 9:00:05

《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/3/28 7:27:19

如何在Android上恢复已删除的联系人

不幸的是&#xff0c;您的联系人有时会被意外地从Android设备中删除。失去联系人可能会给您的个人和职业生活带来许多不便。在这种情况下&#xff0c;您可能想知道如何在Android设备上恢复已删除的联系人。本文将全面讨论如何在Android手机上恢复已删除的联系人。 第 1 部分&am…

作者头像 李华
网站建设 2026/4/14 10:19:52

Native AOT 能改变什么?.NET 预编译技术深度剖析

当面试官问怎么缩小.NET发布后的文件体积、去掉多余依赖呢&#xff1f;想起了AOT,那么提到AOT首先要了解JIT。 长期以来&#xff0c;大多数 .NET 应用都依赖 即时编译&#xff08;JIT&#xff0c;Just-In-Time&#xff09; 机制运行。也就是说&#xff0c;程序发布时是中间语言…

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

【科普】用材料屏蔽阻挡防空间辐射,有用吗?有多大用?

如题&#xff0c;是很多卫星相关产品设计师经常提出的问题。对此&#xff0c;没有简单的答案可以一言以蔽之&#xff0c;需要综合考虑具体的空间辐射危害类型及其根源辐射粒子特性。 空间辐射对卫星造成的危害主要是两大类&#xff0c;一类是与产品寿命相关成正比的确定性累积…

作者头像 李华
网站建设 2026/4/1 12:25:40

聪明的人其实已经发现,26年前端面试已经不对劲了

现在随便刷个职场论坛、求职群&#xff0c;到处都是前端求职者的吐槽——一个岗位扔出去&#xff0c;上千人抢&#xff1b;面试的时候问的全是天花乱坠的高深问题&#xff0c;真等入职了&#xff0c;干的还是最基础的活儿。其实稍微留心点就会发现&#xff0c;2026年前端面试的…

作者头像 李华
网站建设 2026/4/15 17:46:42

Nodejs计算机毕设之基于VUE的时事新闻管理系统基于VUE框架的实时新闻推送平台(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/14 16:25:20

【课程设计/毕业设计】基于VUE框架的新闻订阅平台实时新闻推送平台【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华