P3157-[CQOI2011]动态逆序对【CDQ分治,树状数组】

正题

题目链接:https://www.luogu.com.cn/problem/P3157


题目大意

一个长度为nnn序列,每次删除一个数,求删除前的逆序对数量。


解题思路

时光倒流之后,我们变为每次加入一个数求逆序对数量。

我们将加入一个数的贡献分为后面和前面两部分
后面是加入时后方比他小的数的个数
前面是加入时前方比他大的数的个数

这里用aia_iai表示加入的时间先后,bib_ibi表示位置,cic_ici表示数值

若只考虑后方,我们可以发现加入xxxiii有贡献当且仅当
[ai≤ax&bi>bx&ci<cx][a_i\leq a_x\ \&\ b_i>b_x\ \&\ c_i<c_x][aiax & bi>bx & ci<cx]

然后可以发现这是一个三维偏序问题,我们用CDQ+CDQ+CDQ+树状数组维护。

做两次分别计算前后的贡献就可以了

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+10;
struct node{ll a,b,c;
}a[N];
ll n,m,ans[N],loc[N];
struct Tree_Array{#define lowbit(x) (x&-x)ll t[N];void Change(ll x,ll z){while(x<=n){t[x]+=z;x+=lowbit(x);}}ll Ask(ll x){ll ans=0;while(x){ans+=t[x];x-=lowbit(x);}return ans;}#undef lowbit(x)
}T;
bool cmp_a(node x,node y){if(x.a!=y.a) return x.a<y.a;return (x.b==y.b)?(x.c<y.c):(x.b<y.b);
}
bool cmp_zb(node x,node y)
{return (x.b==y.b)?(x.c<y.c):(x.b<y.b);}
bool cmp_fb(node x,node y)
{return (x.b==y.b)?(x.c>y.c):(x.b>y.b);}
void Cdq(ll l,ll r){if(l==r) return;ll mid=(l+r)>>1;Cdq(l,mid);Cdq(mid+1,r);sort(a+l,a+mid+1,cmp_zb);sort(a+mid+1,a+r+1,cmp_zb);ll k=l;for(ll i=mid+1;i<=r;i++){while(k<=mid&&a[k].b<=a[i].b)T.Change(a[k].c,1),k++;ans[a[i].a]+=T.Ask(a[i].c);}for(ll i=l;i<k;i++)T.Change(a[i].c,-1);return;
}
void Cdp(ll l,ll r){if(l==r) return;ll mid=(l+r)>>1;Cdp(l,mid);Cdp(mid+1,r);sort(a+l,a+mid+1,cmp_fb);sort(a+mid+1,a+r+1,cmp_fb);ll k=l;for(ll i=mid+1;i<=r;i++){while(k<=mid&&a[k].b>=a[i].b)T.Change(n-a[k].c+1,1),k++;ans[a[i].a]+=T.Ask(n-a[i].c+1);}for(ll i=l;i<k;i++)T.Change(n-a[i].c+1,-1);return;
}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)scanf("%lld",&a[i].c),a[i].b=i,loc[a[i].c]=i,a[i].b=n-a[i].b+1;for(ll i=1,x;i<=m;i++)scanf("%lld",&x),a[loc[x]].a=m-i;sort(a+1,a+1+n,cmp_a);Cdq(1,n);sort(a+1,a+1+n,cmp_a);Cdp(1,n);for(ll i=1;i<m;i++)ans[i]+=ans[i-1];for(ll i=m-1;i>=0;i--)printf("%lld\n",ans[i]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5、mysql中的库操作

对数据库的操作包括对数据库的增、删、改、查 接下来介绍一下基本的sql语句 -- 创建数据库 create database 数据库名称 字符集&#xff08;charset utf8&#xff09;; create database czpdb charset urf8; -- czpdb 数据库在磁盘中就是一个文件夹&#xff0c;它下边的db.op…

P5887-Ringed Genesis【GCD】

正题 题目链接:https://www.luogu.com.cn/problem/P5887?contestId24709 题目大意 nnn个洞围成一个环&#xff0c;兔子每次会往前跳kkk个洞&#xff0c;mmm只兔子给出其实位置&#xff0c;求有多少个洞不会被经过。 解题思路 我们可以发现kxnyckxnyckxnyc&#xff0c;有c∣g…

Network of Schools POJ - 1236 tarjan强连通分量缩点

A number of schools are connected to a computer network. Agreements have been developed among those schools: each school maintains a list of schools to which it distributes software (the “receiving schools”). Note that if B is in the distribution list of…

6、mysql中字段

对数据表的操作是比较重要的&#xff0c;在实际开发中&#xff0c;日常做的主要工作就是对数据表的操作 对数据表的操作分为两大部分&#xff1a;操作数据表的结构、操作数据表中的数据 组成数据表的基本单元就是字段&#xff0c;所以&#xff0c;接下来先介绍一下mysql中的字…

bzoj3732-Network【Kruskal重构树模板】

正题 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id3732 题目大意 一张图&#xff0c;每次询问两个点&#xff0c;求这两个点之间路径的最大值的最小是多少。 解题思路 构造一颗KruskalKruskalKruskal重构树然后就是模板了。 codecodecode #include<cstd…

在Linux环境下使用Apache部署ASP.NET Core

在前几篇文章中我们一起探讨了如何在Linux环境中安装ASP.NET Core运行时环境及将ASP.NET Core项目部署在Jexus中&#xff0c;这篇文章中我们将探讨如何将ASP.NET Core部署于Apache&#xff08;阿帕奇&#xff09;中。 很幸运能够和大家一起学习和探讨ASP.NET Core本文章运行…

7、mysql中的表结构操作

之前已经介绍了字段以及修饰字段的一些属性&#xff0c;根据特定的对象可以将字段进行组合&#xff0c;这就有了表的概念&#xff0c;接下来介绍一下如何操 作数据表结构。对数据表结构的操作有添加表、修改表、删除表、查看表结构。 添加表 格式&#xff1a;create table […

P3698-[CQOI2017]小Q的棋盘【树形dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3698 题目大意 nnn个点的树&#xff0c;求从111出发走kkk步最多能到多少个节点。(重复走不算) 解题思路 做法与树形背包类似&#xff0c;但是需要注意的是最后不需要返回原点。 fi,j,0/1f_{i,j,0/1}fi,j,0/1​表示第iii个点…

傲娇码农的自我修养

一个热爱自己职业的人一定会对自己的工作充满自豪感&#xff0c;同样&#xff0c;也应该对自己的工作充满热情和自信。对自己的专业能力骄傲而不自满。身为一个码农&#xff0c;如果你热爱自己的工作&#xff0c;我想&#xff0c;你很有可能也是一位傲娇码农。在我的眼里&#…

8、mysql数据表中数据的增删改

已经介绍了数据表的创建、修改和删除&#xff0c;接下来介绍一下如何往数据表中添加数据、修改数据、删除数据 添加数据 # 默认给表中所有字段添加数据&#xff0c;要保证添加的数据列和字段列一致 insert into user values(5,12,wangwu);# 为表中指定的字段添加数据 insert …

P4071-[SDOI2016]排列计数【组合计数,错排】

正题 题目链接:https://www.luogu.com.cn/problem/P4071 题目大意 每次询问n,mn,mn,m。求有多少个nnn的排列使得aiia_iiai​i的数量恰好为mmm个。 解题思路 首先nnn个之中选择mmm个aiia_iiai​i&#xff0c;选择的方案数为CnmC_{n}^mCnm​。剩下的错排就好了 错排推导di(i−…

中国到底有多少个.NET 程序员?都在哪个城市写代码?

中国到底多少个.NET 程序员&#xff0c;对于这个问题&#xff0c;似乎没有一个准确的答案&#xff0c;而且最近很多使用.NET 开发技术的老板在抱怨找不到.NET 开发人员&#xff0c;所以我想基于我的公众号粉丝数据给大家分享下中国的.NET程序员到底有多少&#xff0c;他们也都是…

9、mysql数据表中数据的查询(1)

使用数据库最终要的莫过于查询数据&#xff0c;所以这里将会详细的介绍mysql数据库中查询语句的使用 普通查询 使用基本的select关键字进行查询&#xff0c;其语法及使用如下 # 格式 select [select选项] 字段 [as 别名] from 数据表;# 查询出所有字段的值&#xff0c;不建议…

P4092-[HEOI2016/TJOI2016]树【线段树,倍增】

正题 题目链接:https://www.luogu.com.cn/problem/P4092 题目大意 nnn个点的树要求支持以下操作 给一个点打上标记求一个节点最近的打上了标记的祖先 解题思路 就是求深度最大的打上了标记的祖先&#xff0c;先跑一遍dfsdfsdfs序&#xff0c;然后对于修改操作就在线段树上整…

微软西雅图总部DevOps交流总结

本文转自Study4台湾社区。Study4台湾社区&#xff0c;成立于2011/9/25&#xff0c;希望藉由社群推广的力量&#xff0c;让台下的朋友听到来自不同县市的大师讲课&#xff0c;也让台上年轻一辈的技术传教士能不断的琢磨并且追上大师这是一个社群&#xff0c;社区希望透过分享&am…

12、数据库的设计范式

设计的数据表一般都是根据实际业务实体模型进行创建&#xff0c;为了提高存储的效率&#xff0c;设计数据表时一般按着几个标准进行设计 第一范式每个字段的数据具有原子性&#xff0c;使用字段的数据时不用再解析&#xff0c;可直接使用第二范式表的每一个字段都必须依赖主键…

C# 快速高效率复制对象另一种方式 表达式树

一、需求在代码中经常会遇到需要把对象复制一遍&#xff0c;或者把属性名相同的值复制一遍。比如&#xff1a;public class Student{public int Id { get; set; }public string Name { get; set; } public int Age { get; set; } }public class StudentSecond{public int Id { …

jzoj3783-[NOIP2014模拟8.19]签到题【结论题】

正题 题目链接:https://jzoj.net/senior/#main/show/3783 题目大意 nnn个数&#xff0c;求这个序列中一个非空子集的和是nnn的倍数。 解题思路 可以知道一定有一种解法是一段连续的序列。 证明:设sxs_xsx​表示(∑i1xai)%n(\sum_{i1}^xa_i)\%n(∑i1x​ai​)%n&#xff0c;那么…

13、mysql中视图的应用

是什么 视图是一种有结构没结果的虚拟表&#xff0c;其结构是从基表中产生的&#xff0c;视图主要用于查询数据。在sql层面上来看&#xff0c;视图就是对select查 询语句的封装&#xff0c;我们看到的虚拟表&#xff08;也就是视图&#xff09;就是select语句查询出的结果组成…

P4768-[NOI2018]归程【kruskal重构树,最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P4768 题目大意 nnn个点mmm条边的无向图&#xff0c;然后每条边有水位和长度。 每次询问一个(v,w)(v,w)(v,w)表示从vvv点出发走高度超过www的路径到达一个点xxx使得x∼1x\sim1x∼1的最短路最短。 解题思路 先用DijDijDij跑出…