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

Input

输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数。
以下n行每行包含一个1到n之间的正整数,即初始排列。
以下m行每行一个正整数,依次为每次删除的元素。
N<=100000 M<=50000

Output

 
输出包含m行,依次为删除每个元素之前,逆序对的个数。

Sample Input5 4 1 5 3 4 2 5 1 4 2

Sample Output5 2 2 1 样例解释 (1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。

思路:逆序对删除可以看作是三维偏序问题,三元组<pos,val,time>,排序定一序,分治定一序,一维直接树状数组维护求和即可

满足逆序对有2种情况:

1.pos0>pos, val0<val, time0<time

2.pos0<pos, val0>val, time0<time

可以在读入时定pos的序,就是求每个点左边值大于这个点的和右边值小于这个点的关于时间的偏序,时间都要大于这个点

在分治时,保证两个区间的pos是有序的,但区间内不保证,因为他们是val序,所以左右区间一个查询一个修改,就能保证pos序了

这样,在分治时分别统计两次即可,注意每次都要清空影响,最后直接用sort排序即可,因为时间大于这个点,所以统计的数量是sum(m+1)-sum(time0)

using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long LL; const int maxm = 1e5+; int C[maxm], n, m, ans[maxm], Cache[maxm]; void add(int x, int val) {
for(; x <= n+; x += lowbit(x))
C[x] += val;
} int getsum(int x) {
int ret = ;
for(; x; x -= lowbit(x))
ret += C[x];
return ret;
} struct Node {
int val, tim, ans;
} buf[maxm], res[maxm]; bool cmpval(Node a, Node b) {
return a.val < b.val;
} void CDQ(int L, int R) {
if(L == R) return;
int mid = (L+R) >> ;
CDQ(L, mid), CDQ(mid+, R);
int i = L, j = mid+;
// 计算右边小于他的
while(i <= mid && j <= R) {
if(res[i].val > res[j].val)
add(res[j++].tim, );
else
res[i].ans += getsum(m+)-getsum(res[i++].tim);
}
while(i <= mid)
res[i].ans += getsum(m+)-getsum(res[i++].tim);
// 清除数组
for(int l = mid+; l < j; ++l)
add(res[l].tim, -); i = mid, j = R;
//左边大于他的
while(j > mid && i >= L) {
if(res[j].val < res[i].val)
add(res[i--].tim, );
else
res[j].ans += getsum(m+)-getsum(res[j--].tim);
}
while(j > mid)
res[j].ans += getsum(m+)-getsum(res[j--].tim);
for(int r = mid; r > i; --r)
add(res[r].tim, -);
sort(res+L, res+R+, cmpval);
} bool cmp2(Node a, Node b) {
return a.tim < b.tim;
} int main() {
scanf("%d%d", &n, &m);
int t;
for(int i = ; i <= n; ++i) {
scanf("%d", &t);
res[i] = {t};
Cache[t] = i;
}
for(int i = ; i <= m; ++i) {
scanf("%d", &t);
res[Cache[t]].tim = i;
}
for(int i = ; i <= n; ++i)
if(res[i].tim == )
res[i].tim = m + ;
LL ans = ;
for(int i = ; i <= n; ++i) {
add(res[i].val, );
ans += i - getsum(res[i].val);
}
for(int i = ; i <= n; ++i)
add(res[i].val, -);
CDQ(, n);
sort(res+, res++n, cmp2);
for(int i = ; i <= m; ++i) printf("%lld\n", ans), ans -= res[i].ans;
return ;
}

Day6 - M - 动态逆序对 HYSBZ - 3295的更多相关文章

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

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

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

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

  3. BZOJ 3295 动态逆序对 | CDQ分治

    BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...

  4. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

  5. bzoj3295[Cqoi2011]动态逆序对 树套树

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

  6. 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)

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

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

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

  8. bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...

  9. BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)

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

随机推荐

  1. mapreduce课上测试

    今天上课的时候进行了一个mapreduce的实验,但是由于课下对于mapreduce还有hive的理解不够透彻,因此导致了课上没能完成这次实验. 关于本次课堂上的实验的内容大致为: 1.对一个70k的 ...

  2. navicat12破解详细教程

    以管理员身份运行此注册机: 运行注册机 打开注册机后,1) Patch勾选Backup.Host和Navicat v12,然后点击Patch按钮: 默认勾选 找到Navicat Premium 12安 ...

  3. Primecoin在windows上的部署和启动服务

     Primecoin在windows上的部署和启动服务: 一.从官方获得Primecoin的windows版安装包: 二.一路像安装客户端一样的安装: 三.安装成功后它会自动弹出客户端运行,同步数据, ...

  4. 支持USB4的Linux 5.6,有望在今年4月份推出

    导读 根据外媒Phoronix的报道,Linux 5.6将支持USB4,. USB4的规范在去年9月份发布,基于雷电3,并与之向后兼容.英特尔的开源部门在去年10月份添加了USB4的初始补丁. 据报道 ...

  5. wikipedia

    1. 维基百科 2. 更多维基项目 3. 有关维基百科的电影列表 4. 维基软件 5. 维基百科相关列表 6. 其他知识分享列表 7. 补充:维基百科使用中好用的关键字 1. 维基百科 https:/ ...

  6. R-CNN算法中NMS的具体做法

    假设有20类,2000个建议框,最后输出向量维数2000*20,则每列对应一类,一行是各个建议框的得分,NMS算法步骤如下: ① 对2000×20维矩阵中每列按从大到小进行排序: ② 从每列最大的得分 ...

  7. Xftp和Xshell

    Xftp 用于跟云虚拟机文件传输的工具,Xftp官网 Xshell Xftp的兄弟工具,用于执行云虚拟机命令,Xshell官网 两个都是付费工具,各需要几百块钱,当然破解的版本也很多 登陆 这两个的连 ...

  8. h5 穿透滚动

    引子 h5 页面有弹窗浮层时,浮层之下若产生了滚动,滑动浮层时会让其产生滚动.这是示例页面,移动端访问如下: Origin My GitHub 原因 找到的信息里面有两种说法: 使用了 -webkit ...

  9. Golang gin框架学习

    今天开始学习gin框架,在Github上找的示例的go-gin-example, 进度 日期 进展 疑惑 进展 1.30 下拉代码,初步了解gin的介绍.搭建 .mod文件 module原理.使用方法 ...

  10. 越南FCK批量拿站

    关键词:inurl:detail_product.asp?lang= /FCKeditor/_samples/asp/sample01.asp/FCKeditor/_samples/asp/sampl ...