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

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
#define ll long long
int read(){int z=,mark=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mark=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mark;
}
struct cdd{int x,y,z;}a[],q[];
int n,m,b[]; int N;
bool usd[]; int tt=;
ll e[]; int lbt[];
ll ans[];
int re[];
void gtlbt(){for(int i=;i<=n;++i) lbt[i]=i&-i;}
void mdf(int x,int y){while(x<=n) e[x]+=y,x+=lbt[x];}
ll qr(int x){ll bwl=; while(x) bwl+=e[x],x-=lbt[x]; return bwl;}
void cdq(int l,int r){
if(l==r) return ;
int md=(l+r)>>;
for(int i=l;i<=r;++i){
if(a[i].z>md) mdf(a[i].y,);
else ans[a[i].z]+=qr(n)-qr(a[i].y);
}
for(int i=l;i<=r;++i)if(a[i].z>md) mdf(a[i].y,-);
for(int i=r;i>=l;--i){
if(a[i].z>md) mdf(a[i].y,);
else ans[a[i].z]+=qr(a[i].y);
}
for(int i=l;i<=r;++i)if(a[i].z>md) mdf(a[i].y,-);
int t1=l,t2=md+;
for(int i=l;i<=r;++i) q[(a[i].z<=md?t1:t2)++]=a[i];
for(int i=l;i<=r;++i) a[i]=q[i];
cdq(l,md),cdq(md+,r);
}
bool cmp(cdd x,cdd y){return x.x<y.x;}
int main(){//freopen("ddd.in","r",stdin);
memset(usd,,sizeof(usd));
cin>>n>>m; N=n-m;
gtlbt();
for(int i=;i<=n;++i) b[i]=read(),re[b[i]]=i;
for(int i=;i<=m;++i) a[++tt].y=read(),a[i].x=re[a[i].y],a[i].z=i,usd[a[i].x]=true;
for(int i=;i<=n;++i)if(!usd[i]) a[++tt].x=i,a[tt].y=b[i],a[tt].z=tt;
sort(a+,a+n+,cmp);
cdq(,n);
for(int i=n;i>;--i) ans[i-]+=ans[i];
for(int i=;i<=m;++i) printf("%I64d\n",ans[i]);
return ;
}

【BZOJ3295】【CQOI2011】动态逆序对的更多相关文章

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

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

  2. bzoj3295[Cqoi2011]动态逆序对 树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5987  Solved: 2080[Submit][Sta ...

  3. 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)

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

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

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

  5. bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...

  6. BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7465  Solved: 2662[Submit][Sta ...

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

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

  8. bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)

    3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...

  9. [bzoj3295][Cqoi2011]动态逆序对_主席树

    动态逆序对 bzoj-3295 Cqoi-2011 题目大意:题目链接. 注释:略. 想法:直接建立主席树. 由于是一个一个删除,所以我们先拿建立好的root[n]的权值线段树先把总逆序对求出来,接着 ...

  10. bzoj3295: [Cqoi2011]动态逆序对(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

随机推荐

  1. Java读取xml

    首先将xml的格式展示出来,如下 <?xml version="1.0"?> <configuration> <connectionStrings n ...

  2. 只输FLOAT值 TEXTBOX

    if (((int)e.KeyChar < 48 || (int)e.KeyChar > 57) && (int)e.KeyChar != 8 && (in ...

  3. (Gorails)vuejs系列视频: Webpacker/vue-resource(不再为官方推荐)。

    频:https://gorails.com/episodes/using-vuejs-for-nested-forms-part-1?autoplay=1 在嵌套表格上使用vue.js. 在appli ...

  4. 4-6 select_tag和select的区别和理解。javascript_tag

    via: :all是什么意思?主要用于约束http动作. <%= select_tag "set_locale", options_for_select(LANGUAGES, ...

  5. 3-9《元编程》第3章Tuesday:methods

    第3章methods Ruby是动态语言,有静态语言实现不了的技巧.本章讲解代码的重构,把代码变得更简洁. 3.2Dynamic Methods 3.21Calling Methods Dynamic ...

  6. php 浮点数

    $num = 10.4567; //第一种:利用round()对浮点数进行四舍五入 echo round($num,2); //10.46 //第二种:利用sprintf格式化字符串 $format_ ...

  7. vijos 1046 floyd求最小环

    // 转自vijos题解 最小环问题<1>朴素的算法:令e(u,v)表示u和v之间的连边,再令min(u,v)表示,删除u和v之间的连边之后,u和v之间的最短路最小环则是min(u,v) ...

  8. python 抓取搜狗微信出现的问题,求大神解决

    爬取到的data不是想要获取文章页面的源码,而是跳转到验证码的页面的源码.我网上查了一下是由于访问过于频繁导致的,我也加了time.sleep和改了请求头但还是显示不了,求大神支招,除了识别验证码的方 ...

  9. Oracle DISTINCT A 排序问题(转)

    请问Oracle 中有ID,A栏要怎么读出栏的不重复值,并且用ID来排序,請大家帮帮忙? 解决方案: ID | A 1 | x 2 | y 3 | x A栏的不重复值: x, y 但用ID來排序时 x ...

  10. Logger.getLogger()和LogFactory.getLog()的区别

    第一.Logger.getLogger()和LogFactory.getLog()的区别 1.Logger.getLogger()是使用log4j的方式记录日志: 2.LogFactory.getLo ...