【LG1393】动态逆序对

题面

洛谷

题解

\(CDQ\)分治,按照时间来分治

应为一个删除不能对前面的操作贡献,所以考虑一个删除操作对它后面时间的操作的贡献

用上一个答案减去次贡献即可

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
namespace IO {
const int BUFSIZE = 1 << 20;
char ibuf[BUFSIZE], *is = ibuf, *it = ibuf;
inline char gc() {
if (is == it) it = (is = ibuf) + fread(ibuf, 1, BUFSIZE, stdin);
return *is++;
}
}
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (ch != '-' && (ch > '9' || ch < '0')) ch = IO::gc();
if (ch == '-') w = -1 , ch = IO::gc();
while (ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = IO::gc();
return w * data;
}
const int MAX_N = 40005;
struct Node { int x, y, z, s; } t[MAX_N];
bool cmp_x(Node a, Node b) { return a.x < b.x; }
bool cmp_y(Node a, Node b) { return a.y < b.y; }
int N, M, ans, X[MAX_N], a[MAX_N], b[MAX_N], c[MAX_N], d[MAX_N];
inline int lb(int x) { return x & -x; }
void add(int x, int v) { while (x <= N) c[x] += v, x += lb(x); }
int sum(int x) { int res = 0; while (x > 0) res += c[x], x -= lb(x); return res; }
void Div(int l, int r) {
if (l == r) return ;
int mid = (l + r) >> 1;
Div(l, mid); Div(mid + 1, r);
int j = mid + 1;
for (int i = l; i <= mid; i++) {
for ( ; j <= r && t[j].y < t[i].y; ) add(t[j].z, 1), ++j;
t[i].s += sum(N) - sum(t[i].z);
}
for (int i = mid + 1; i < j; i++) add(t[i].z, -1);
j = r;
for (int i = mid; i >= l; i--) {
for ( ; j > mid && t[j].y > t[i].y; ) add(t[j].z, 1), --j;
t[i].s += sum(t[i].z - 1);
}
for (int i = r; i > j; i--) add(t[i].z, -1);
inplace_merge(&t[l], &t[mid + 1], &t[r + 1], cmp_y);
}
int main () {
N = gi(), M = gi();
for (int i = 1; i <= N; i++) X[i] = a[i] = gi();
sort(&X[1], &X[N + 1]);
for (int i = 1; i <= N; i++) a[i] = lower_bound(&X[1], &X[N + 1], a[i]) - X;
for (int i = N; i >= 1; i--) ans += sum(a[i] - 1), add(a[i], 1);
for (int i = 1; i <= N; i++) t[i].x = N + 1, t[i].y = i, t[i].z = a[i];
for (int i = 1; i <= M; i++) {
d[i] = gi();
t[d[i]].x = i;
}
sort(&t[1], &t[N + 1], cmp_x);
memset(c, 0, sizeof(c));
Div(1, N);
for (int i = 1; i <= N; i++) c[t[i].y] = t[i].s;
printf("%d ", ans);
for (int i = 1; i <= M; i++) printf("%d ", ans -= c[d[i]]);
return 0;
}

【LG1393】动态逆序对的更多相关文章

  1. LG1393 动态逆序对

    问题描述 LG1393 题解 本题可以使用\(\mathrm{CDQ}\)分治完成. 二维偏序 根据偏序的定义,逆序对是一个二维偏序,但这个二维偏序比较特殊: \(i>j,a_i<a_j\ ...

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

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

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

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

  4. 【Luogu1393】动态逆序对(CDQ分治)

    [Luogu1393]动态逆序对(CDQ分治) 题面 题目描述 对于给定的一段正整数序列,我们定义它的逆序对的个数为序列中ai>aj且i < j的有序对(i,j)的个数.你需要计算出一个序 ...

  5. 【BZOJ3295】动态逆序对(线段树,树状数组)

    [BZOJ3295]动态逆序对(线段树,树状数组) 题面 Description 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的 ...

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

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

  7. cdq分治(hdu 5618 Jam's problem again[陌上花开]、CQOI 2011 动态逆序对、hdu 4742 Pinball Game、hdu 4456 Crowd、[HEOI2016/TJOI2016]序列、[NOI2007]货币兑换 )

    hdu 5618 Jam's problem again #include <bits/stdc++.h> #define MAXN 100010 using namespace std; ...

  8. P3157 [CQOI2011]动态逆序对(树状数组套线段树)

    P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...

  9. P3157 [CQOI2011]动态逆序对

    P3157 [CQOI2011]动态逆序对 https://www.luogu.org/problemnew/show/P3157 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai&g ...

随机推荐

  1. Python迭代(入门8)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6407980.html 本文出自:[Edwin博客园] Python迭代 1. 什么是迭代 注意: 集合是指包 ...

  2. [转] 从此不再惧怕URI编码:JavaScript及C# URI编码详解

    混乱的URI编码 JavaScript中编码有三种方法:escape.encodeURI.encodeURIComponent C#中编码主要方法:HttpUtility.UrlEncode.Serv ...

  3. BZOJ2337:[HNOI2011]XOR和路径(高斯消元)

    Description 给定一个无向连通图,其节点编号为 1 到 N,其边的权值为非负整数.试求出一条从 1 号节点到 N 号节点的路径,使得该路径上经过的边的权值的“XOR 和”最大.该路径可以重复 ...

  4. 1、ClassLoader.getResourceAsStream() 与Class.getResourceAsStream()的区别

    1.ClassLoader.getResourceAsStream() 与Class.getResourceAsStream()的区别 例如你写了一个MyTest类在包com.test.mycode ...

  5. iview中position: 'fixed'最顶层z-index

    使用iview时候使用<Header :style="{position: 'fixed', width: '100%'}">不是最顶层解决方案 根据样式进行解决在ap ...

  6. linux iptables 开启和关闭服务端口号

    需求: 模拟数据库挂掉,服务正常但访问数据库报错,恢复数据库端口后,服务是否能正常访问数据库 步骤:首先,断掉端口号5432,测试服务运行情况:其次,开启端口号5432,测试服务运行情况: 具体操作: ...

  7. 安装oracle11g时遇到环境不满足最低要求

    在安装oracle11g时出现问题:INS-13001环境不满足最低要求 解决方法:找到下载解压后的文件,依次打开以下文件路径:Oracle11g\database\stage\cvu, 在cvu文件 ...

  8. oracle之DQL

    一.单表查询 语法:select * from table where 条件 group by 分组 having 过滤分组 order by 排序 --查询平均工资低于2000的部门的最大工资和平均 ...

  9. iOS多语言设置

    最近公司做的项目需要向国外推广,因此app需要添加相应的语言设置,为此整理记录下多语言设置的过程.如有不对的地方,欢迎各位大神指正.下面就详细介绍下设置的过程: 1.基本设置 第一步:首先在 项目工程 ...

  10. iOS11、iPhone X、Xcode9 适配指南

    更新iOS11后,发现有些地方需要做适配,整理后按照优先级分为以下三类: 1.单纯升级iOS11后造成的变化: 2.Xcode9 打包后造成的变化: 3.iPhoneX的适配 一.单纯升级iOS11后 ...