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分治+树状数组)的更多相关文章

  1. BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组

    BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一 ...

  2. [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...

  3. BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治

    题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 1 ...

  4. BZOJ3295:[CQOI2011]动态逆序对(CDQ分治)

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

  5. 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治

    [BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...

  6. [CQOI2011]动态逆序对 CDQ分治

    洛谷上有2道相同的题目(基本是完全相同的,输入输出格式略有不同) ---题面--- ---题面--- CDQ分治 首先由于删除是很不好处理的,所以我们把删除改为插入,然后输出的时候倒着输出即可 首先这 ...

  7. 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治

    题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...

  8. BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]

    RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...

  9. bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组

    [bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...

随机推荐

  1. 2015.04.30,外语,读书笔记-《Word Power Made Easy》 14 “如何谈论日常现象” SESSION 40

    1. money, and what it will buy penury(['penjuri] n. 贫穷,拮据),来自拉丁词语penuria(need,needness的意思),主要指缺乏财富资源 ...

  2. OzymanDNS 使用——perl 5.22没有成功。。。

    最初官方的代码没有找到,但是发现github里貌似有: git clone https://github.com/splitbrain/dnstunnel.git 源码是perl写的,需要安装一些pe ...

  3. 子线程中刷新了UI

    This application is modifying the autolayout engine from a background thread, which can lead to engi ...

  4. 实现SSRS订阅

    以前曾经搞过SSRS的订阅,使用的是公司的邮件服务器,最近QQ群中有妹子问到同样的问题,虽然没能帮人家搞定,下面写出自己参考的资料,以供各位参考: 一.订阅前准备工作(转载自http://blog.s ...

  5. .csv文件内容分隔符

    CSV文件默认以英文逗号做为列分隔符,换行符作为行分隔符.  如果不提供网页形式只用命令行或二进制程序输出数据到CSV,只需要将数据段按,分割,行按\n分割,写入到一个.csv文件即可.  但有时字段 ...

  6. web_测试用例注意点

    测试是一种思维,包括情感思维和智力思维,情感思维主要体现在一句俗语:思想决定行动上(要怀疑一切),智力思维主要体现在测试用例的设计上.具有了这样的思想,就会找出更多的bug.(^_^个人认为,不代表官 ...

  7. input上传文件获取文件后缀名+select通过text选中option

    1.input获取后缀名 var fileName = $("input[type='file']").val();//获取上传的文件(单个) var extName = file ...

  8. 利用after和before伪元素在文字两边写横线

    示例: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  9. C语言基本语法——变量

    1.变量作用域 2.局部变量 3.全局变量 4.变量生命周期 5.auto关键字 6.static关键字 1.变量作用域 • 变量作用域是指变量的有效范围 • 变量作用域是定义变量从何处被创建,到何处 ...

  10. 一些BFC

    我们可能会遇到这样的一些问题,比如:子元素浮动,父元素高度塌陷:父元素跟随子元素一起移动等 这是我们可以通过触发BFC来解决这样的问题. BFC为"块级格式化上下文".它是一个独立 ...