正题

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


题目大意

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


解题思路

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

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

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

若只考虑后方,我们可以发现加入xxx时iii有贡献当且仅当
[ai≤ax&bi>bx&ci<cx][a_i\leq a_x\ \&\ b_i>b_x\ \&\ c_i<c_x][ai​≤ax​ & 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]);
}

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

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

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

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

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

  3. BZOJ 3295: [Cqoi2011]动态逆序对 cdq分治

    https://www.lydsy.com/JudgeOnline/problem.php?id=3295 这个妹妹我曾见过的~~~ 之前应该在校内oj写了,似乎还写过题解?发现没写博客就重新水一遍代 ...

  4. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...

  5. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同. 求所有情况下都满足的最长不降 ...

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

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

  7. [cdq分治][树状数组] Bzoj P3262 陌上花开

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...

  8. CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)

    题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...

  9. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

最新文章

  1. php蜘蛛池搭建教程,【小旋风教程】万能蜘蛛池x4安装教程 _ 惠州SEO
  2. idea删除module
  3. MFC 网络编程 -- 总结
  4. ajax上传plupload的使用
  5. 可以在一个函数中定义另一个函数_第5周 定义一个函数
  6. 2018春考计算机技能考试题目,2018年山东省春季高考技能考试信息技术类专业考试(样题).PDF...
  7. WPF-DataContext
  8. 无线覆盖技术的重要性
  9. mcafee杀死oracle,【搬运】跟客服要来的迈克菲卸载工具,拯救你的笔记本
  10. 微信公众号支付开发流程
  11. Spark入门(一)概述
  12. 苹果手机通过扫描二维码下载APP
  13. itext设置字体间距_微信公众号文章字体怎么修改?行间距、字间距一般设置多少?...
  14. 计量单位报错:消息号BM302 “未使用语言 ZH 创建单位 XXX”
  15. java 8 把list中对象的属性转成list
  16. 微信小程序怎么实现 图片按住一角缩放、旋转、拖拽
  17. 第十五周作业——ZJM与生日礼物
  18. Kettle 通俗易懂讲明白值映射
  19. 在OpenWrt上配置原生IPv6 NAT,,实现校园网路由器使用ipv6
  20. 服务器网维虚拟盘无法启动,网维大师网吧虚拟磁盘客户机不出盘案例

热门文章

  1. 京东面试官:呦,你对中间件 Mycat了解的还挺深~
  2. navicat如何连接腾讯mysql_使用Navicat连接腾讯云Mysql数据库
  3. 128位计算机 ps2,64位就是最强电脑?难道就没有128位的电脑吗
  4. python二维列表写入excel_用Python实现合并excel列表
  5. 通过图书编号查询python_文字版图书管理-python练习
  6. python通过封装可以实现代码复用_Python学习笔记(五)函数和代码复用
  7. 香肠派对电脑版_香肠派对先行服s7赛季下载-香肠派对先行服s7赛季最新版下载...
  8. 网站底部运行时间的php代码,网站底部运行时间统计代码
  9. idea如何导入java工程_Eclipse java web项目 ,导入IntelliJ IDEA 完整操作!
  10. 7-17 汉诺塔的非递归实现 (25 分)(思路分析)