【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. Types of Computer Systems

    Types of Computer Systems Para 1 You should be familiar with the differences among computer systems ...

  2. 在powerdesigner 中出现Could not Initialize JavaVM! 应该怎么解决

    利用powerdesigner反向生成表结构时会报这个错: 请检查你的环境变量配置: 系统变量 CLASSPATH = E:\Workspaces\my-jar\mysql-connector-jav ...

  3. Java虚拟机3:内存溢出

    1.前言 上一篇我们介绍了java的内存区域结构,这一篇,模拟内存溢出的几个场景,下面一个图是总体的指导思想: 2.Java堆溢出 Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不 ...

  4. C++ 全局变量不明确与 using namespace std 冲突

    写了个汉诺塔,使用全局变量count来记录步数,结果Error:count不明确 #include <iostream> using namespace std; ; void hanoi ...

  5. 用python实现ping

    #!/usr/bin/env python #coding=utf-8 import os import argparse import socket import struct import sel ...

  6. git忽略文件留存

    ##ignore this file##/target/ .classpath.project.settings /.settings/ ##filter databfile.sln file##*. ...

  7. 【洛谷P2279】[HNOI2003]消防局的设立

    消防局的设立 题目链接 贪心:每次取出深度最大的节点,若没有被覆盖到,要想覆盖它, 最优的做法显然是将它的爷爷设为消防局 (因为该节点深度为最大,选兄弟.父亲所覆盖的节点,选了爷爷后都能够覆盖) 用优 ...

  8. platform平台总线

    一.何为平台总线 (1)相对于usb.pci.i2c等物理总线来说,platform总线是虚拟的.抽象出来的.(2)CPU与外部通信的2种方式:地址总线式连接和专用协议类接口式连接.平台总线,是扩展到 ...

  9. 修改本机默认的jdk版本

    因为开发需要使用多个jdk,在修改jdk版本时遇到了一些问题 在系统变量的%JAVA_HOME%中修改了jdk的路径,但是重启后java -version版本并没有改变. 在网上找到一篇文章,修改了注 ...

  10. Oracle树形结构数据-相关知识总结

    Oracle树形结构数据--基本知识 1.数据组成 2.基本查询 2.1.查询某节点及该节点下的所有子孙节点 SELECT   *      FROM QIANCODE.TREE_TABLE_BASI ...