【题目链接】

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. 1196: [HNOI2006]公路修建问题 - BZOJ

    Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织 ...

  2. 团队软件开发_基于windows下截屏软件关于NABC框架的特点

    经过我们小组数次的激烈讨论,就自己的能力和时间而言,我们小组的初步的计划是开发一款基于windows下的截图软件. 关于这个软件的功能,我们初步的想法如下: 1.能在windows下后台运行,有相应的 ...

  3. 10 things you should know about NoSQL databases

    For a quarter of a century, the relational database (RDBMS) has been the dominant model for database ...

  4. POJ2586——Y2K Accounting Bug

    Y2K Accounting Bug   Description Accounting for Computer Machinists (ACM) has sufferred from the Y2K ...

  5. Android Editext监听光标位置

    因为项目需要,需要实时监听光标的位置变化,网上提出的用TextWatcher和onTouchListener中调用contentText.getSelectionStart()都是获取的上一次位置. ...

  6. TSharding:用于蘑菇街交易平台的分库分表组件

    tsharding TSharding is the simple sharding component used in mogujie trade platform. 分库分表业界方案 分库分表TS ...

  7. The document has been modified outside of Code Composer. Would you like to reload the file

    2013-06-20 10:03:32 烧写过程是合众达给出的文档 problem: I'm new to using Code Composer Studio 3.3 and am having a ...

  8. Apache Wamp WampServer 配置多端口 多站点 虚拟目录

    第一步:配置Apache 的 httpd.conf #Listen 0.0.0.0:80Listen 80Listen 81 第二步:开启虚拟站点 所属文件:httpd.conf #Virtual h ...

  9. PHP搭建OAuth2.0

    这几天一直在搞OAuth2.0的东西,写SDK啥的,为了更加深入的了解服务端的OAuth验证机制,就自己动手搭了个php下OAuth的环境,并且将它移植到了自己比较熟的tp框架里. 废话不多说,开动. ...

  10. 如何在一个frame中调用另一个frame中的javascript函数

    1.htm <script language="javascript">function test(){alert("测试")}</scrip ...