bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)
3295: [Cqoi2011]动态逆序对
题目:传送门
题解:
刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波
还是太弱了...想到了要做两次cdq...然后伏地膜大佬
其实需要维护的地方还是很容易想到的:
第一维维护位置w,第二维维护数值s,第三维维护修改的时间t。
那么对于t我们可以倒序插入,然后我们就可以把它看作t从小到大的插入结点(即使没有删除的点为了方便也要更新一下t)。
再去观察就会发现,当我们插入一个节点t0时,我们需要求的就是在t0左边的比它大的数和在右边比它小的数:
t<t0 w<w0 s>s0
t<t0 w>w0 s<s0
再转化一下符号:
t<t0 w<w0 s<(n-s0+1)
t<t0 w<(n-w0+1) s<s0
这时候再看,不就是陌上花开吗!!!
ps:大佬实在是太强了,记得开longlong(虽然不是很懂为什么,但是就是错了...)
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
struct node
{
int w,s,t;//位置,数值,操作时间
LL ans;//当前时间的答案
}a[],ba[];int n,m,b[];LL ans[];
bool cmp(node n1,node n2){return n1.t<n2.t;}
LL s[];
int lowbit(int x){return x&-x;}
void add(int x,int k){while(x<=n){s[x]+=k;x+=lowbit(x);}}
int getsum(int x){LL ans=;while(x){ans+=s[x];x-=lowbit(x);}return ans;}
void cdq(int l,int r)
{
if(l==r)return ;
int mid=(l+r)>>;
cdq(l,mid);cdq(mid+,r);
int i=l,j=mid+,p=l;
while(i<=mid && j<=r)
{
if(a[i].w<a[j].w)
{
add(a[i].s,);
ba[p++]=a[i++];
}
else
{
a[j].ans+=getsum(a[j].s);
ba[p++]=a[j++];
}
}
while(i<=mid)add(a[i].s,),ba[p++]=a[i++];
while(j<=r)a[j].ans+=getsum(a[j].s),ba[p++]=a[j++]; for(int i=l;i<=mid;i++)add(a[i].s,-); for(int i=l;i<=r;i++)a[i]=ba[i];
}
int main()
{
scanf("%d%d",&n,&m);int x,cc=n;
for(int i=;i<=n;i++)a[i].w=i,scanf("%d",&a[i].s);
for(int i=;i<=m;i++)scanf("%d",&x),b[x]=i;int s=m;
for(int i=;i<=n;i++)if(!b[i])b[i]=++s;
for(int i=;i<=n;i++)a[i].t=n-b[a[i].s]+;
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++)a[i].s=n-a[i].s+;
cdq(,n);
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++)
{
a[i].s=n-a[i].s+;
a[i].w=n-a[i].w+;
}
cdq(,n);
for(int i=;i<=n;i++)ans[a[i].t]=a[i].ans;
for(int i=;i<=n;i++)ans[i]+=ans[i-];
for(int i=n;i>=n-m+;i--)printf("%lld\n",ans[i]);
return ;
}
bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)的更多相关文章
- BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组
BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一 ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 1 ...
- BZOJ3295:[CQOI2011]动态逆序对(CDQ分治)
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
- [CQOI2011]动态逆序对 CDQ分治
洛谷上有2道相同的题目(基本是完全相同的,输入输出格式略有不同) ---题面--- ---题面--- CDQ分治 首先由于删除是很不好处理的,所以我们把删除改为插入,然后输出的时候倒着输出即可 首先这 ...
- 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治
题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...
- BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]
RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...
- bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...
随机推荐
- Shiro 学习应用(续)
在前面的文章中为大家介绍了 Shrio 的基础概念.可能比較笼统.没有深入到开发过程的一些问题.如今集中在本帖中归纳一下有关问题. FormAuthenticationFilter 表单过滤器 表单过 ...
- UVA - 11722 Joining with Friend 几何概率
Joining with Friend You are going from Dhaka to Chittagong by train and you ...
- zzulioj--1769--去师院的旅程:能怎么走(三)(0.0)
1796: 去师院的旅程:能怎么走(三) Time Limit: 1 Sec Memory Limit: 128 MB Submit: 404 Solved: 200 SubmitStatusWe ...
- wamp openssl
在这一章节里, 我记录了一下如何在 wamp 环境下配置 ssl 前提条件 在设置 Apache + SSL 之前, 需要确认 Apache 已经安装并可以正常工作. 并且 ssl 需要的文件在如下的 ...
- QlikSense系列(1)——整体介绍
接触QlikSense(3.1 SR1)已经快一年了,在此记录自己的经验心得,为想了解QlikSense的小伙伴提供一个参考. 1.产品介绍 Qlik公司以QlikView产品成名,QlikSense ...
- 微信小程序引用阿里巴巴矢量图标iconfont
最近在写微信小程序,但是引用图片,导致项目文件太大,所以就想到引用阿里巴巴矢量图标的方法 第一步:下载阿里巴巴矢量图代码: 第二步:将下载下来的文件中iconfont.ttf转换即可.转换地址:htt ...
- Android自定义日历控件(继承系统控件实现)
Android自定义日历控件(继承系统控件实现) 主要步骤 编写布局 继承LinearLayout设置子控件 设置数据 继承TextView实现有圆圈背景的TextView 添加Attribute 添 ...
- Sphinx在windows下安装使用[支持中文全文检索]
原文地址:http://www.fuchaoqun.com/2008/11/sphinx-on-windows-xp/ 前 一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/ ...
- iOS构建流畅的交互界面--CPU,GPU资源消耗的原因和解决方案
CPU资源消耗的原因和解决方案对象创建轻量对象代替重量对象* 不需要响应触摸事件的控件:CALayer显示* 对象不涉及UI操作,则尽量放到后台线程创建* 包含有CALayer的控件只能在主线程创建和 ...
- 20 个让你效率更高的 CSS 代码技巧
在这里想与你分享一个由各大CSS网站总结推荐的20个有用的规则和实践经验集合.有一些是面向CSS初学者的,有一些知识点是进阶型的.希望每个人通过这篇文章都能学到对自己有用的知识. 1.注意外边距折叠 ...