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

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

时间、位置、数字为三个属性。

排序时间,CDQ位置,树状数组处理数字即可。

#include 
#include
#include
#include
using namespace std;#define F(i,j,k) for (int i=j;i<=k;++i)#define D(i,j,k) for (int i=j;i>=k;--i)#define ll long long#define maxn 100005int a[maxn],q[maxn],n,m,pos[maxn],del[maxn];struct Event{ int t;//时间 int x;//加入的数 int y;//加入的位置 }b[maxn];struct Bit_Tree{ int x[maxn]; void add(int i,int f) { for (;i
b.y;} ll ans[maxn]; void CDQ(int l,int r,int flag){ if (l==r) return ; int mid=l+r>>1; CDQ(l,mid,flag); CDQ(mid+1,r,flag); int pl=l; if (flag) F(i,mid+1,r) { while (b[pl].y
<=mid) BT.add(b[pl++].x,1); int tmp=BT.gs(n)-BT.gs(b[i].x-1); ans[b[i].t]+=tmp; } else F(i,mid+1,r) { while (b[pl].y>b[i].y&&pl<=mid) BT.add(b[pl++].x,1); int tmp=BT.gs(b[i].x-1); ans[b[i].t]+=tmp; } F(i,l,pl-1) BT.add(b[i].x,-1); sort(b+l,b+r+1,flag?cmp2:cmp3);} int main(){ scanf("%d%d",&n,&m); F(i,1,n) scanf("%d",&a[i]),pos[a[i]]=i; F(i,1,m) { scanf("%d",&q[i]); del[q[i]]=1; b[i].t=n-i+1; b[i].x=q[i]; b[i].y=pos[q[i]]; } int now=m; F(i,1,n) if (!del[i]) { b[++now].t=n-now+1; b[now].x=i; b[now].y=pos[i]; } sort(b+1,b+n+1,cmp1); CDQ(1,n,1); sort(b+1,b+n+1,cmp1); CDQ(1,n,0); F(i,2,n) ans[i]+=ans[i-1]; D(i,n,n-m+1) printf("%lld\n",ans[i]);}

  

转载于:https://www.cnblogs.com/SfailSth/p/6607064.html

你可能感兴趣的文章
Oracle闪回技术
查看>>
利用单壁路由实现vlan间路由
查看>>
hello world
查看>>
CentOS 7 配置yum本地base源和阿里云epel源
查看>>
python 学习导图
查看>>
生成树
查看>>
深入浅出JavaScript (五) 详解Document.write()方法
查看>>
Beta冲刺——day6
查看>>
Comet OJ - Contest #3 题解
查看>>
[网络流24题-9]试题库问题
查看>>
在一个程序中调用另一个程序并且传输数据到选择屏幕执行这个程序
查看>>
HDOJ_ACM_Rescue
查看>>
笔记纪录
查看>>
九、oracle 事务
查看>>
Git - 操作指南
查看>>
正则表达式的贪婪与非贪婪模式
查看>>
SqlServer存储过程调用接口
查看>>
DOM
查看>>
通过jQuery.support看javascript中的兼容性问题
查看>>
NYOJ-取石子
查看>>