博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ3295】【CQOI2011】动态逆序对
阅读量:6268 次
发布时间:2019-06-22

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

cdq分治经典例题,然而智商掉线傻逼错误坑了两天

原题:

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

N<=100000 M<=50000

 

此题修改和询问绑定完全离线,可以直接倒序变成插入,然后就是三维数星星辣(ง •̀∀•́)ง

x为下标,y为值,z为时间轴,x排序,z_cdq分治,y树状数组

不用搞两次cdq分治,每次按x递增查找比y大的,然后按x递减查找比y小的

注意当x递增的时候查找的是比y大的,因为虽然x是递增,但是修改上去的都是比当前x小的

然后我先计算贡献再把小于mid的放左边大于mid的放右边然后进入下一层的做法是没有问题的

问题在于我傻逼题中删除的是值我删的是下标

注意longlong

代码:

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 using namespace std; 9 #define ll long long10 int read(){ int z=0,mark=1; char ch=getchar();11 while(ch<'0'||ch>'9'){ if(ch=='-')mark=-1; ch=getchar();}12 while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0'; ch=getchar();}13 return z*mark;14 }15 struct cdd{ int x,y,z;}a[110000],q[110000];16 int n,m,b[110000]; int N;17 bool usd[110000]; int tt=0;18 ll e[110000]; int lbt[110000];19 ll ans[110000];20 int re[110000];21 void gtlbt(){ for(int i=1;i<=n;++i) lbt[i]=i&-i;}22 void mdf(int x,int y){ while(x<=n) e[x]+=y,x+=lbt[x];}23 ll qr(int x){ll bwl=0; while(x) bwl+=e[x],x-=lbt[x]; return bwl;}24 void cdq(int l,int r){25 if(l==r) return ;26 int md=(l+r)>>1;27 for(int i=l;i<=r;++i){28 if(a[i].z>md) mdf(a[i].y,1);29 else ans[a[i].z]+=qr(n)-qr(a[i].y);30 }31 for(int i=l;i<=r;++i)if(a[i].z>md) mdf(a[i].y,-1);32 for(int i=r;i>=l;--i){33 if(a[i].z>md) mdf(a[i].y,1);34 else ans[a[i].z]+=qr(a[i].y);35 }36 for(int i=l;i<=r;++i)if(a[i].z>md) mdf(a[i].y,-1);37 int t1=l,t2=md+1;38 for(int i=l;i<=r;++i) q[(a[i].z<=md?t1:t2)++]=a[i];39 for(int i=l;i<=r;++i) a[i]=q[i];40 cdq(l,md),cdq(md+1,r);41 }42 bool cmp(cdd x,cdd y){ return x.x
>n>>m; N=n-m;46 gtlbt();47 for(int i=1;i<=n;++i) b[i]=read(),re[b[i]]=i;48 for(int i=1;i<=m;++i) a[++tt].y=read(),a[i].x=re[a[i].y],a[i].z=i,usd[a[i].x]=true;49 for(int i=1;i<=n;++i)if(!usd[i]) a[++tt].x=i,a[tt].y=b[i],a[tt].z=tt;50 sort(a+1,a+n+1,cmp);51 cdq(1,n);52 for(int i=n;i>1;--i) ans[i-1]+=ans[i];53 for(int i=1;i<=m;++i) printf("%I64d\n",ans[i]);54 return 0;55 }
View Code

 

转载于:https://www.cnblogs.com/JSL2018/p/6418354.html

你可能感兴趣的文章
SQL经典面试题集锦
查看>>
View学习(一)-DecorView,measureSpec与LayoutParams
查看>>
色彩力量!21款你应该知道的优秀品牌设计
查看>>
SDUT 3503 有两个正整数,求N!的K进制的位数
查看>>
【.Net】C# 根据绝对路径获取 带后缀文件名、后缀名、文件名、不带文件名的文件路径...
查看>>
Redis常用命令速查 <第二篇>
查看>>
CSS规范
查看>>
使用FastDateFormat来代替JDK自带的DateFormat
查看>>
Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法
查看>>
Android源代码解析之(三)--&gt;异步任务AsyncTask
查看>>
(zhuan) 自然语言处理中的Attention Model:是什么及为什么
查看>>
C#中使用RabbitMQ收发队列消息
查看>>
Hadoop1.2.1 全然分布式集群搭建实操笔记
查看>>
第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求...
查看>>
MVC总结--MVC简单介绍以及和WebForm差别
查看>>
tiny4412 裸机程序 五、控制icache【转】
查看>>
VB.NET多线程入门
查看>>
国外物联网平台初探(二) ——微软Azure IoT
查看>>
findlibrary returned null产生的联想,Android ndk开发打包时我们应该怎样注意平台的兼容(x86,arm,arm-v7a)...
查看>>
Android事件分发机制源代码分析
查看>>