【题目链接】

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. centos7 下载eclipse的镜像站点

    这里吐槽一下,由于两天前centos被我农崩溃了(系统更新的锅),所以所有的开发环境又得重来一次. 其实,之前去eclipse的官网下载就很慢,打开官网也很慢,然后你会发现下下来的安装程序(只有40多 ...

  2. LDPY Ghost Win7 64位 纯净自选版 V5.0

    ★ 概述: ☆ 源安装盘是[Windows7_SP1_ULTIMATE]微软官方SP1正式版. ☆ 破解激活WIN7,补丁更新至2013/06/18所有系统安全关键补丁. ☆ 破解 Windows 7 ...

  3. poj 1870 Bee Breeding

    思路:首先要建立坐标,具体作法见:http://www.cnblogs.com/xin-hua/p/3237096.html 然后将得到2坐标之差x,y:如果x,y同号,则相加,否则去最大.(要取绝对 ...

  4. libevent学习之二:Windows7(Win7)下编译libevent

    Linux下编译参考源码中的README文件即可,这里主要记录Windows下的编译. 一.准备工作 去官网下载最新的稳定发布版本libevent-2.0.22-stable 官网地址:http:// ...

  5. 188. Best Time to Buy and Sell Stock IV

    题目: 链接: 题解: 测试: Reference:

  6. CentOS7安装Docker时的异常报错与解决方法

    重要:有些人在vmware中安装了新的centos用于使用docker,但是往往会忽略了更换源与进行系统update, 这样会导致安装过程中出现诸多如下类问题,为了避免不必要的麻烦在安装docker前 ...

  7. EL表达式 JSTL中的常用EL函数 动态数据的国际化

    ELppt: EL 全名为Expression Language.EL主要作用: 获取数据: •EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数据.( ...

  8. JSP内置标签 JSP中JavaBean标签 JSP开发模式 EL和JSTL快速入门

    2 JSP内置标签(美化+业务逻辑)   1)为了取代<%%>脚本形式,使用JSP标签/JSP动作,目的:与JSP页面的美化,即JSP面页都是由标签组成,不再有其它的内容   2)JSP内 ...

  9. JavaScript DOM高级程序设计 5动态修改样式和层叠样式表2--我要坚持到底!

    把样式置于DOM脚本之外 style属性 我们可以这样设置前景色之类的属性: element.style.color='red'; 也可以使用下面的代码设置背景颜色: element.style.ba ...

  10. mysql修改表、字段、库的字符集

    在一次导入数据表(MYISAM)的经历:复制过来的表打开后中文出现乱码,肯定是字符集出现了不致的问题,所以从原数据库导出.sql文件,修改其中的创建表的语句,加入字符集DEFAULT CHARSET= ...