bzoj 3295 [Cqoi2011]动态逆序对(cdq分治,BIT)
【题目链接】
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)的更多相关文章
- BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]
RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...
- BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治
时间.位置.数字为三个属性. 排序时间,CDQ位置,树状数组处理数字即可. #include <cstdio> #include <cstring> #include < ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)
3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...
- BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 1 ...
- BZOJ 3295: [Cqoi2011]动态逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3865 Solved: 1298[Submit][Sta ...
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
- bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
随机推荐
- centos7 下载eclipse的镜像站点
这里吐槽一下,由于两天前centos被我农崩溃了(系统更新的锅),所以所有的开发环境又得重来一次. 其实,之前去eclipse的官网下载就很慢,打开官网也很慢,然后你会发现下下来的安装程序(只有40多 ...
- LDPY Ghost Win7 64位 纯净自选版 V5.0
★ 概述: ☆ 源安装盘是[Windows7_SP1_ULTIMATE]微软官方SP1正式版. ☆ 破解激活WIN7,补丁更新至2013/06/18所有系统安全关键补丁. ☆ 破解 Windows 7 ...
- poj 1870 Bee Breeding
思路:首先要建立坐标,具体作法见:http://www.cnblogs.com/xin-hua/p/3237096.html 然后将得到2坐标之差x,y:如果x,y同号,则相加,否则去最大.(要取绝对 ...
- libevent学习之二:Windows7(Win7)下编译libevent
Linux下编译参考源码中的README文件即可,这里主要记录Windows下的编译. 一.准备工作 去官网下载最新的稳定发布版本libevent-2.0.22-stable 官网地址:http:// ...
- 188. Best Time to Buy and Sell Stock IV
题目: 链接: 题解: 测试: Reference:
- CentOS7安装Docker时的异常报错与解决方法
重要:有些人在vmware中安装了新的centos用于使用docker,但是往往会忽略了更换源与进行系统update, 这样会导致安装过程中出现诸多如下类问题,为了避免不必要的麻烦在安装docker前 ...
- EL表达式 JSTL中的常用EL函数 动态数据的国际化
ELppt: EL 全名为Expression Language.EL主要作用: 获取数据: •EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数据.( ...
- JSP内置标签 JSP中JavaBean标签 JSP开发模式 EL和JSTL快速入门
2 JSP内置标签(美化+业务逻辑) 1)为了取代<%%>脚本形式,使用JSP标签/JSP动作,目的:与JSP页面的美化,即JSP面页都是由标签组成,不再有其它的内容 2)JSP内 ...
- JavaScript DOM高级程序设计 5动态修改样式和层叠样式表2--我要坚持到底!
把样式置于DOM脚本之外 style属性 我们可以这样设置前景色之类的属性: element.style.color='red'; 也可以使用下面的代码设置背景颜色: element.style.ba ...
- mysql修改表、字段、库的字符集
在一次导入数据表(MYISAM)的经历:复制过来的表打开后中文出现乱码,肯定是字符集出现了不致的问题,所以从原数据库导出.sql文件,修改其中的创建表的语句,加入字符集DEFAULT CHARSET= ...