洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治
题目:https://www.luogu.org/problemnew/show/3157
题解:
1.对于静态的逆序对可以用树状数组做
2.我们为了方便可以把删除当成增加,可以化动为静
3.找到三维:时间,位置,大小
然后CDQ分治
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 200010
typedef long long ll;
using namespace std;
ll n,m,ans[N],a[N],t[N];
struct point
{
ll t,pos,val;
bool operator < (const point &x)const
{return val>x.val;}
}p[N],tmp[N];
bool cmp(const point &x,const point &y)
{return x.t<y.t;}
void add(int x,int k)
{
for (;x<N;x+=x&-x) t[x]+=k;
}
ll query(int x)
{
ll ret=0;
for (;x;x-=x&-x) ret+=t[x];
return ret;
}
void solve(int l,int r)
{
if (l==r) return ;
int mid=l+r>>1,i=l,j=mid+1;
solve(l,mid),solve(mid+1,r);
for (int k=l;k<=r;k++)
if (i<=mid && (p[i]<p[j] || j>r))
tmp[k]=p[i++];
else tmp[k]=p[j++];
for (i=l;i<=r;i++)
{
p[i]=tmp[i];
if (p[i].t<=mid) add(p[i].pos,1);
else ans[p[i].t]+=query(p[i].pos);
}
for (i=l;i<=r;i++)
if (p[i].t<=mid) add(p[i].pos,-1);
for (i=r;i>=l;i--)
if (p[i].t<=mid) add(p[i].pos,1);
else ans[p[i].t]+=query(n)-query(p[i].pos);
for (i=l;i<=r;i++)
if (p[i].t<=mid) add(p[i].pos,-1); }
int main()
{
scanf("%lld%lld",&n,&m);
for (int i=1,x;i<=n;i++)
scanf("%lld",&x),p[x].val=x,p[x].pos=i;
for (int i=0,x;i<m;i++)
scanf("%lld",&x),p[x].t=n-i;
for (int i=1,cnt=0;i<=n;i++)
if (!p[i].t) p[i].t=++cnt;
sort(p+1,p+n+1,cmp);
solve(1,n);
for(int i=1;i<=n;i++)
ans[i]+=ans[i-1];
for(int i=n;i>=n-m+1;i--)
printf("%lld\n",ans[i]);
return 0;
}
洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治的更多相关文章
- 洛谷 P3157 [CQOI2011]动态逆序对 解题报告
P3157 [CQOI2011]动态逆序对 题目描述 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n ...
- 洛谷 P3157 [CQOI2011]动态逆序对(树套树)
题面 luogu 题解 树套树(树状数组套动态开点线段树) 静态使用树状数组求逆序对就不多说了 用线段树代替树状数组,外面套树状数组统计每个点逆序对数量 设 \(t1[i]\)为\(i\)前面有多少个 ...
- 洛谷P3157 [CQOI2011]动态逆序对
题目大意: 给定\(1\)到\(n\)的一个排列,按照给定顺序依次删除\(m\)个元素,计算每个元素删除之前整个序列的逆序对数量 基本套路:删边变加边 那么我们不就是求满足\(pos_i<pos ...
- P3157 [CQOI2011]动态逆序对 CDQ分治
一道CDQ分治模板题简单来说,这道题是三维数点对于离线的二维数点,我们再熟悉不过:利用坐标的单调递增性,先按更坐标排序,再按纵坐标排序更新和查询时都直接调用纵坐标.实际上,我们是通过排序将二维中的一维 ...
- LUOGU P3157 [CQOI2011]动态逆序对(CDQ 分治)
传送门 解题思路 cdq分治,将位置看做一维,修改时间看做一维,权值看做一维,然后就转化成了三维偏序,用排序+cdq+树状数组.注意算删除贡献时要做两次cdq,分别算对前面和后面的贡献. #inclu ...
- P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)
P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
- BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 1 ...
随机推荐
- Lucene检索提高性能的几个方式
1.采用最新版本的Lucene 2.索引文件存储采用本地文件系统,如果需要挂载远程系统,请采用 readonly方式. 3.当然采用更好的硬件,更高I/O的磁盘 4.提高OS 缓存,调整参数 5.提高 ...
- Python 初始—(文件操作)
文件修改,我们可以不用讲一个文件全部都进行读取,然后放入内存,如果文件过大,容易造成内存的 内存溢出问题 因此我们可以便读取边进行修改操作 f=open("old.txt",&qu ...
- Centos7上docker的安装和基本使用
Centos7上Docker的相关操作 Docker的安装 1.检查内核版本 docker使用linux的内核必须是3.10以上,首先需要 # uname -r 2.使用yum安装docker # y ...
- 使用Docker 一键部署 LNMP+Redis 环境
使用Docker 部署 LNMP+Redis 环境 Docker 简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linu ...
- 关于IT人的一些消遣区
https://www.csdn.net/http://www.51cto.com/http://bestcbooks.com/http://www.jobbole.com/http://www.co ...
- win7同时安装python2和python3
1.下载python2和python3版本. 2.安装python3 1>选择添加PATH路径到系统. 2>为所有用户安装python. 3.安装python2 1>为所 ...
- php解决sql_server连接问题
1.首先根据phpinfo()查看当前php版本以及线程安全情况(ts或者nts):2.下载sqlsrv扩展(适用32位php) 下载链接为https://www.microsoft.com/en-u ...
- cookie操作和代理
cookie操作 爬取豆瓣个人主页 # -*- coding: utf-8 -*- import scrapy class DoubanSpider(scrapy.Spider): name = 'd ...
- Python 编码格式的使用
编码史 ASCII > Unicode > UTF-8 Unicode支持多语言,UTF-8自动转换长短细节节省空间 在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传 ...
- realloc函数的用法
realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小. 如果将分配的内存减少,realloc仅仅是改变索引的 ...