【题目链接】

http://www.lydsy.com/JudgeOnline/problem.php?id=3295

【题意】

n个元素依次删除m个元素,求删除元素之前序列有多少个逆序对。

【思路】

cdq分治

这个题转化一下可以变成刚刚做过的三维偏序。

首先有两个量:序 和 值,可以将样例写成
    x   1
2 3 4 5

y   1 5
3 4 2

然后因为我们要删除一些东西,所以加上时间,则样例变为

t   1 2
3 4 5

x   3 5
4 1 2

y   3 2
4 1 5

删除顺序就是按照t从大到小。我们把它看作t从小到大的插入结点。

则我们要求的是,一个结点在t时刻插入,左边有多少个比它大,右边有多少个比它小,设这个点为(t0,x0,y0),则我们要求的就是满足

t<t0,x<x0,y>y0

t<t0,x>x0,y<y0

的点数。因为具体的值对结果并无影响我们可以通过把a改成n-a+1来改变符号的方向,具体就是求满足

t<t0,x<x0,y<(n-y0+1)

t<t0,x<(n-x0+1),y<y0

的点数。

  于是问题变成了刚做过的
陌上花开 问题。

  最后统计每个时间点发生之前产生的所有逆序对。

【代码】

 #include<cstdio>
#include<iostream>
#include<algorithm>
#define rep(a,b,c) for(int a=b;a<=c;++a)
using namespace std; typedef long long ll;
const int N =*1e5+; void read(int &x) {
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*+c-'',c=getchar();
} struct Node {
int a,b,c,ans;
bool operator<(const Node& rhs) const {
return a<rhs.a;
}
}q[N],T[N];
bool cmp(const Node& x,const Node& y)
{
return x.b<y.b||(x.b==y.b&&x.c>y.c);
} int n,m,mx,C[N],rk[N];
ll ans[N]; void add(int x,int v)
{
for(;x<=mx;x+=x&-x) C[x]+=v;
}
int query(int x)
{
int res=;
for(;x;x-=x&-x) res+=C[x];
return res;
} void solve(int l,int r)
{
if(l==r) return ;
int mid=(l+r)>>;
solve(l,mid) , solve(mid+,r);
int l1=l,l2=mid+,i;
while(l2<=r) {
while(l1<=mid&&q[l1].b<q[l2].b) {
add(q[l1].c,);
l1++;
}
q[l2].ans+=query(q[l2].c);
l2++;
}
for(i=l;i<l1;i++) add(q[i].c,-);
l1=l,l2=mid+; int now=l;
while(l1<=mid||l2<=r) {
if(l2>r||l1<=mid&&cmp(q[l1],q[l2])) T[now++]=q[l1++];
else T[now++]=q[l2++];
}
for(int i=l;i<=r;i++) q[i]=T[i];
} int main()
{
read(n),read(m); mx=n+;
rep(i,,n) { q[i].b=i; read(q[i].c); }
int a;
rep(i,,m) { read(a); rk[a]=i; }
int sz=m;
rep(i,,n) if(!rk[i]) rk[i]=++sz;
rep(i,,n) q[i].a=n-rk[q[i].c]+;
sort(q+,q+n+);
rep(i,,n) q[i].b=n-q[i].b+;
solve(,n);
sort(q+,q+n+);
rep(i,,n) {
q[i].b=n-q[i].b+;
q[i].c=n-q[i].c+;
}
solve(,n);
rep(i,,n) ans[q[i].a]=q[i].ans;
rep(i,,n) ans[i]+=ans[i-];
for(int i=n;i>n-m;i--)
printf("%lld\n",ans[i]);
return ;
}

bzoj 3295 [Cqoi2011]动态逆序对(cdq分治,BIT)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. awk 的一个奇怪异常

    awk: cmd. line:1: (FILENAME=- FNR=192) fatal: print to "standard output" failed (No space ...

  2. js学习之函数表达式及闭包

    来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(七) 直接切入主题~ 定义函数的方式有两种: 函数声明 function functio ...

  3. uva 147

    一个简单的dp   面值是5的倍数  将面值都除5   因为输出问题wa .... #include <iostream> #include <cstring> #includ ...

  4. uva 624

    背包问题  总时间为容量,单个唱片时间为各个物体的价值与体积   f[] 用来记录路径 #include <cstdio> #include <cstring> #define ...

  5. 【POJ 3335】 Rotating Scoreboard (多边形的核- - 半平面交应用)

    Rotating Scoreboard Description This year, ACM/ICPC World finals will be held in a hall in form of a ...

  6. 如何用Java语言向串口读写数据

    原作者:赛迪网作者 shihuchen ,我在他的基础上进行了部分修改 [赛迪网讯]串口, RS-232-C(又称EIA RS-232-C,以下简称RS232)是在1970年由美国电子工业协会(EIA ...

  7. 启动C:\Windows\System32\logiLDA.DLL时出现问题,找不到指定模块

    环境:windows8.1专业版 问题:启动C:\Windows\System32\logiLDA.DLL时出现问题,找不到指定模块 每次开机都会弹出上图所示的信息. 经过查找是罗技鼠标驱动的问题:而 ...

  8. EXP-00091 Exporting questionable statistics

    今天在我们对Oracle做EXP的过程中,出现EXP-00091 Exporting questionable statistics.的信息,但是也提示导出成功.最好查询了下发现其实它就是exp的er ...

  9. FireBug 调试JS入门

    http://www.blogjava.net/vincent/archive/2009/04/14/265591.html   http://baike.baidu.com/link?url=0S2 ...

  10. 摄像头(5)使用Camera2 替代过时的Camera API

    转自: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0428/2811.html 概要 从5.0开始(API Level 21 ...