RT

传送门


首先可以看成倒着插入,求逆序对数

每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值

$CDQ(l,r)$时归并排序$x$

然后用$[l,mid]$的加入更新$[mid+1,r]$的查询(其实每个数就是一个插入一个查询)

这里就是前后求逆序对,用树状数组

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=2e5+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m;
int mp[N];
struct Operation{
int t,x,y;
Operation(){}
Operation(int t,int id,int v):t(t),x(id),y(v){}
bool operator <(const Operation &r)const{
return x==r.x ? y<r.y : x<r.x;
}
}a[N],t[N];
inline bool cmpTime(const Operation &a,const Operation &b){
return a.t==b.t ? a.x<b.x : a.t<b.t;
}
int c[N];
inline int lowbit(int x){return x&-x;}
inline void add(int p,int v){for(;p<=n;p+=lowbit(p)) c[p]+=v;}
inline int sum(int p){
int re=;
for(;p;p-=lowbit(p)) re+=c[p];
return re;
}
ll ans[N];
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(j>r||(i<=mid&&a[i]<a[j])) add(a[i].y,),t[p++]=a[i++];
else ans[a[j].t]+=sum(n)-sum(a[j].y),t[p++]=a[j++];
}
for(int i=l;i<=mid;i++) add(a[i].y,-);
for(int i=l;i<=r;i++) a[i]=t[i];
for(int i=r;i>=l;i--){
if(a[i].t<=mid) add(a[i].y,);
else ans[a[i].t]+=sum(a[i].y);
}
for(int i=l;i<=r;i++) if(a[i].t<=mid) add(a[i].y,-);
}
int main(){
//freopen("inverse.in","r",stdin);
//freopen("inverse.out","w",stdout);
n=read();m=read();
for(int i=;i<=n;i++) a[i]=Operation(,i,read()),mp[a[i].y]=i;
int Tim=n;
for(int i=;i<=m;i++) a[mp[read()]].t=Tim--;
for(int i=;i<=n;i++) if(!a[i].t) a[i].t=Tim--;
sort(a+,a++n,cmpTime);
//for(int i=1;i<=10;i++) printf("hi %d %d %d\n",i,a[i].t,a[i].y);
CDQ(,n);
//for(int i=1;i<=10;i++) printf("ans %d %d\n",i,ans[i]);
for(int i=;i<=n;i++) ans[i]+=ans[i-];
for(int i=n;i>=n-m+;i--) printf("%lld\n",ans[i]);
}

【update 2017-03-17】

前两天学到了删除的姿势,逆序对问题的删除操作不用时间倒流也可以,直接减去它形成的逆序对数并且在树状数组中删除就可以了

虽然慢一些但是清晰多了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=2e5+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int n,Q,a[N],pos[N],x;
int m,tim;
struct meow{
int t,x,y,type,qid;
meow(){}
meow(int a,int b,int c,int d,int e=):t(a),x(b),y(c),type(d),qid(e){}
bool operator <(const meow &r) const{
return x==r.x ? y<r.y : x<r.x;
}
}q[N],t[N];
ll ans[N]; int c[N];
inline void add(int p,int v) {for(;p<=n;p+=(p&-p)) c[p]+=v;}
inline int sum(int p) {int re=; for(;p;p-=(p&-p)) re+=c[p]; return re;} void CDQ(int l,int r){
if(l==r) return;
int mid=(l+r)>>;
for(int i=l;i<=r;i++){
if(q[i].t<=mid) add(q[i].y,q[i].type);
else ans[q[i].qid]+= q[i].type*( sum(n)-sum(q[i].y) );
}
for(int i=l;i<=r;i++) if(q[i].t<=mid) add(q[i].y,-q[i].type); for(int i=r;i>=l;i--){
if(q[i].t<=mid) add(q[i].y,q[i].type);
else ans[q[i].qid]+= q[i].type*sum(q[i].y-);
}
for(int i=l;i<=r;i++) if(q[i].t<=mid) add(q[i].y,-q[i].type); int p1=l,p2=mid+;
for(int i=l;i<=r;i++){
if(q[i].t<=mid) t[p1++]=q[i];
else t[p2++]=q[i];
}
for(int i=l;i<=r;i++) q[i]=t[i];
CDQ(l,mid); CDQ(mid+,r);
} int main(){
freopen("in","r",stdin);
n=read(); Q=read();
for(int i=;i<=n;i++) a[i]=read(), pos[a[i]]=i, q[++m]=meow(++tim, i, a[i], , ); for(int i=;i<=Q;i++) x=read(), q[++m]=meow(++tim, pos[x], x, -, i);
sort(q+, q++m);
CDQ(,m);
for(int i=;i<=Q;i++) ans[i]+=ans[i-],printf("%lld\n",ans[i-]);
}

BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]的更多相关文章

  1. BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治

    时间.位置.数字为三个属性. 排序时间,CDQ位置,树状数组处理数字即可. #include <cstdio> #include <cstring> #include < ...

  2. Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2886  Solved: 924[Submit][Stat ...

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

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

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

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

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

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

  6. BZOJ 3295: [Cqoi2011]动态逆序对

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

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

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

  8. bzoj 3295 [Cqoi2011]动态逆序对(cdq分治,BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3295 [题意] n个元素依次删除m个元素,求删除元素之前序列有多少个逆序对. [思路] ...

  9. bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)

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

随机推荐

  1. Android扫码二维码、美女瀑布流、知乎网易音乐、动画源码等

    Android精选源码 QRCode 扫描二维码.扫描条形码.相册获取图片后识别.生...   一个简洁好看的loading弹窗   Android用瀑布流展示美女图片源码   Android知乎阅读 ...

  2. 说说 typedef 的那些事

    最近在复习数据结构时,经常看到 typedef 的身影,但始终不清楚 typedef 的用法具体时怎么样的,特地查阅<C Primer Plus 第5版>,并将查到的内容写出来供大家沟通学 ...

  3. C#的LINQ

    在过去如果我们如果需要去查询某些集合或者数组里面的某些元素,我们需要写出大量的带有筛选的遍历集合的代码,但是有了Linq之后,我们就不用写出那些冗余麻烦的遍历代码,只需要关注其中的筛选,排列的函数就可 ...

  4. Oracle忘记密码如何重

    ---恢复内容开始--- 昨天安装Oracle11g R2的时候给scott用户设置密码,当时没有显示而且还只以输入一次,可能密码输入错误,结果今天用scott用户登录果然密码不对,还好sys和sys ...

  5. PHPStudy+PHPStorm下配置隐藏项目入口文件

    img { max-width: 100% } 默认情况下项目入口文件是站点根目录下index.php文件,一般程序启动时通过这个文件,定义文件路径,配置重要节点(比如是否开启调试模式),注册路由等, ...

  6. Oracle_事务

    Oracle_事务 -事物管理   create table account(        id number,        money number );     --实现转账操作 update ...

  7. 一个简单的div弹出层的小例子

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  8. PID算法

    所谓PID就是比例-积分-微分的英文缩写,但并不是必须同时具备这三种算法,也可以是 PD, PI,甚至只有 P算法控制,下面分别介绍每个参数的含义:首先需要明确一个事实就是,要实现PID算法,必须在硬 ...

  9. linux_磁盘分区

    分区并没有数据内容只是改变分区表,保存在0磁头,0磁道1扇区除MBR引导后64bytes中,只能有4个组分区,4个以上要一个扩展分区 引导MBR,保存在446字节中 磁盘想要存放数据,首先要分区,可以 ...

  10. android新建项目

    MinMum Required SDK :最低支持的Android api的版本,你的应用不能在低于这个版本的手机上面运行 Target SDK:你的应用最高支持android api版本 Compi ...