BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治
时间、位置、数字为三个属性。
排序时间,CDQ位置,树状数组处理数字即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define maxn 100005
int a[maxn],q[maxn],n,m,pos[maxn],del[maxn];
struct Event{
int t;//时间
int x;//加入的数
int y;//加入的位置
}b[maxn];
struct Bit_Tree{
int x[maxn];
void add(int i,int f)
{
for (;i<maxn;i+=i&(-i)) x[i]+=f;
}
int gs(int i)
{
int ret=0;
for (;i;i-=i&(-i)) ret+=x[i];
return ret;
}
}BT; bool cmp1(Event a,Event b) {return a.t<b.t;} bool cmp2(Event a,Event b) {return a.y<b.y;} bool cmp3(Event a,Event b) {return a.y>b.y;} ll ans[maxn]; void CDQ(int l,int r,int flag)
{
if (l==r) return ;
int mid=l+r>>1;
CDQ(l,mid,flag); CDQ(mid+1,r,flag);
int pl=l;
if (flag) F(i,mid+1,r)
{
while (b[pl].y<b[i].y&&pl<=mid) BT.add(b[pl++].x,1);
int tmp=BT.gs(n)-BT.gs(b[i].x-1);
ans[b[i].t]+=tmp;
}
else F(i,mid+1,r)
{
while (b[pl].y>b[i].y&&pl<=mid) BT.add(b[pl++].x,1);
int tmp=BT.gs(b[i].x-1);
ans[b[i].t]+=tmp;
}
F(i,l,pl-1) BT.add(b[i].x,-1);
sort(b+l,b+r+1,flag?cmp2:cmp3);
} int main()
{
scanf("%d%d",&n,&m);
F(i,1,n) scanf("%d",&a[i]),pos[a[i]]=i;
F(i,1,m)
{
scanf("%d",&q[i]);
del[q[i]]=1;
b[i].t=n-i+1;
b[i].x=q[i];
b[i].y=pos[q[i]];
}
int now=m;
F(i,1,n)
if (!del[i])
{
b[++now].t=n-now+1;
b[now].x=i;
b[now].y=pos[i];
}
sort(b+1,b+n+1,cmp1);
CDQ(1,n,1);
sort(b+1,b+n+1,cmp1);
CDQ(1,n,0);
F(i,2,n) ans[i]+=ans[i-1];
D(i,n,n-m+1) printf("%lld\n",ans[i]);
}
BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治的更多相关文章
- BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]
RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...
- 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]动态逆序对(cdq分治,BIT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3295 [题意] n个元素依次删除m个元素,求删除元素之前序列有多少个逆序对. [思路] ...
- bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
随机推荐
- xml文件解析和序列化
转载:http://blog.csdn.net/liuhe688/article/details/6415593 XmlPullParser parser = Xml.newPullParser(); ...
- iOS Category 添加属性实现原理 - 关联对象
iOS Category 添加属性实现原理 - 关联对象 RunTime为Category动态关联对象 使用RunTime给系统的类添加属性,首先需要了解对象与属性的关系.对象一开始初始化的时候其属性 ...
- (十三)maven之release和snapshots
发布release 用户A将代码打包到RELEASE仓库.用户B使用时,需要在pom.xml添加jar包的依赖坐标.如果用户A将jar包版本从1.0升级到2.0,用户B使用时也需要在pom.xml中修 ...
- Asp.Net Core 进阶(二) —— 集成Log4net
Asp.Net Core 支持适用于各种内置日志记录API,同时也支持其他第三方日志记录.在我们新建项目后,在Program 文件入口调用了CreateDefaultBuilder,该操作默认将添加以 ...
- Freemarker入门小案例(生成静态网页的其中一种方式)
其实生成静态网页的方式有好多种,我昨天看了一下,Freemarker是其中一种,但是Freemarker现在我们都用得比较少了,现在用得ActiveMQ用来发送信息到静态页面,不过想了一下这个小东西, ...
- fossil 代理设置
C:\>fossil user new Joe C:\>fossil user default Joe 设置账户 fossil setting proxy http://-:-fossil ...
- UEditor中多图上传的bug
多图上传 预览:支持浏览器版本 IE8以上 在线管理:由于存在bug,显示不了 ueditor-1.1.1.jar解压后找到FileManager 1.修改com.baidu.ueditor.hun ...
- iOS利用UIDocumentInteractionController和Quick Look打开或预览文档
在App的开发过程中,我们避免不了要打开软件中的文件,例如:Excel文件,Word文件,图片文件等不同格式的文件或者想要通过第三方的App来打开这些文件,那么我们就要用到UIDocumentInte ...
- Go统计键盘输入随机字母的个数
package main import "fmt" //通过键盘输入20个小写字母,统计个数 func main(){ //通过键盘器获取字符 var arr [20]byte f ...
- Java测试技巧
快捷键 修改快捷键 window->preference->general->keys: 查找引用:ctrl+shift+g 覆盖测试:alt+shift+E,T 复制一行:ctrl ...