博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj3295: [Cqoi2011]动态逆序对
阅读量:5926 次
发布时间:2019-06-19

本文共 1898 字,大约阅读时间需要 6 分钟。

Description

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

Input

输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数。
以下n行每行包含一个1到n之间的正整数,即初始排列。
以下m行每行一个正整数,依次为每次删除的元素。
N<=100000 M<=50000

Output

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

Sample Input

5 4
1
5
3
4
2
5
1
4
2

Sample Output

5
2
2
1
样例解释
(1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。

终于实战了一下分治(o゚v゚)ノ
先确定基本的思路:
我们只要算出出针对每个数他被删除时破坏了多少对逆序对即可
首先每个数开始时参与了多少个逆序对时很容易算出来的
那么我们只要对每个数而言计算删它之前有多少已经被删了的数是在他前面比他大,或者在他后面比他小
而这个东西就可以分治了。
比如说我们按照时间劈成两个区间
这样就只用统计左区间对右区间的影响就好了
事先用位置进行排序再处理就可以了~
具体看看码吧(终于自己做出来一道233ˋ( ° ▽、° ) 
1 #include
2 #include
3 #include
4 #define ll long long 5 #define maxn 100005 6 #define maxm 50005 7 using namespace std; 8 int n,m; 9 int c[maxn],a[maxn],s[maxn],e[maxm],pos[maxn],t[maxm];10 ll ans;11 void add(int x,int z){
while(x<=n){c[x]+=z;x+=x&(-x);}}12 int sum(int x){
int ans=0;while(x){ans+=c[x];x-=x&(-x);}return ans;}13 int query(int l,int r){
if(l>r)return 0;return sum(r)-sum(l-1);}14 bool cmp(int x,int y){
return pos[x]
r||(tx<=mid&&pos[e[tx]]
=l||ty>=mid+1){27 if((ty
=l&&pos[e[tx]]>pos[e[ty]]))add(e[tx--],1);28 else{s[e[ty]]-=query(1,e[ty]);ty--;}29 }30 for(int i=l;i<=mid;i++)add(e[i],-1);31 sort(e+l,e+r+1,cmp);32 }33 int main(){34 scanf("%d%d",&n,&m);35 for(int i=1;i<=n;i++)scanf("%d",&a[i]),pos[a[i]]=i;36 for(int i=1;i<=n;i++){s[a[i]]+=query(a[i]+1,n);add(a[i],1);ans+=s[a[i]];}37 memset(c,0,sizeof(c));38 for(int i=n;i>=1;i--){s[a[i]]+=sum(a[i]);add(a[i],1);}39 memset(c,0,sizeof(c));40 for(int i=1;i<=m;i++)scanf("%d",&e[i]),t[i]=e[i];41 solve(1,m);42 for(int i=1;i<=m;i++){43 printf("%lld\n",ans);44 ans-=s[t[i]];45 }46 return 0;47 }
View Code

 话说这是不是有点压行啊。。。

转载于:https://www.cnblogs.com/2017SSY/p/10199519.html

你可能感兴趣的文章
深入剖析阿里云推荐引擎——新架构,新体验
查看>>
辨别真假数据科学家必备手册:深度学习45个基础问题(附答案)
查看>>
Ubuntu 每日技巧- 自动备份Ubuntu 14.04到Box云存储上
查看>>
在 Linux 下使用 RAID(二):使用 mdadm 工具创建软件 RAID 0 (条带化)
查看>>
《超越需求:敏捷思维模式下的分析》—第1章 1.1节简介
查看>>
《移动App测试的22条军规》—第1章1.2节移动App的生命周期
查看>>
《HTML5触摸界面设计与开发》——1.4 神秘谷,是什么让触摸界面反应灵敏?...
查看>>
Linux性能优化2.1 CPU性能统计信息
查看>>
《手机测试Robotium实战教程》——导读
查看>>
《面向对象的思考过程(原书第4版)》一1.11 组合
查看>>
JAVA多线程和并发基础面试问答
查看>>
《BeagleBone开发指南》——1.7 小结
查看>>
人之将死其言也善?30年来死囚遗言分析
查看>>
《Java和Android开发学习指南(第2版)》—— 1.5 本章小结
查看>>
《统计会犯错——如何避免数据分析中的统计陷阱》—第2章置信区间的优势
查看>>
《编译与反编译技术》—第1章1.7节C语言程序的编译流程
查看>>
LinkedIn联合创始人:硅谷也就700万人,为什么能创建这么多瞩目的公司 ?
查看>>
《计算机组成原理》----2.3 二进制运算
查看>>
Yet another nio framework for java
查看>>
《 线性代数及其应用 (原书第4版)》——1.2 行化简与阶梯形矩阵
查看>>