题面

luogu

题解

树套树(树状数组套动态开点线段树)

静态使用树状数组求逆序对就不多说了

用线段树代替树状数组,外面套树状数组统计每个点逆序对数量



\(t1[i]\)为\(i\)前面有多少个数比\(a[i]\)大

\(t2[i]\)为\(i\)后面有多少个数比\(a[i]\)小

那么当删除\(a[i]\)时

\(ans\) \(=\) \(ans-(t1[i]+t2[i])+\)\(i\)前面有多少个数比\(a[i]\)大且已经被删了+\(i\)后面有多少个数比\(a[i]\)小且已经被删了

用树套树维护就好了

Code

#include<bits/stdc++.h>

#define LL long long
#define RG register using namespace std; inline int gi() {
RG int x = 0; RG char c = getchar(); bool f = 0;
while (c != '-' && (c < '0' || c > '9')) c = getchar();
if (c == '-') c = getchar(), f = 1;
while (c >= '0' && c <= '9') x = x*10+c-'0', c = getchar();
return f ? -x : x;
}
const int N = 100010, M = 50010;
int t[N], n, m;
LL ans;
#define lowbit(x) (x&(-x));
inline int Tsum(int x) {
int s = 0;
while (x) s += t[x], x -= lowbit(x);
return s;
}
inline void Tadd(int x) {while (x <= n) t[x]++, x += lowbit(x);} struct node {
int ls, rs, v;
}st[6000010];
int root[N]; int a[N], t1[N], t2[N], id[N], cnt; void update(int &rt, int l, int r, int k) {
if (!rt) rt = ++cnt;
st[rt].v++;
if (l == r) return ;
int mid = (l + r) >> 1;
if (k <= mid) update(st[rt].ls, l, mid, k);
else update(st[rt].rs, mid+1, r, k);
} int sum(int rt, int l, int r, int L, int R) {
if (!rt) return 0;
if (L <= l && r <= R) return st[rt].v;
int mid = (l + r) >> 1, s = 0;
if (L <= mid) s = sum(st[rt].ls, l, mid, L, R);
if (R > mid) s += sum(st[rt].rs, mid+1, r, L, R);
return s;
} int query(int x, int l, int r) {
int s = 0;
if (l > r) return 0;
while (x) {
s += sum(root[x], 1, n, l, r);
x -= lowbit(x);
}
return s;
} void insert(int x, int k) {
while (x <= n) {
update(root[x], 1, n, k);
x += lowbit(x);
}
return ;
} int main() {
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
n = gi(), m = gi();
for (int i = 1; i <= n; i++) a[i] = gi(), id[a[i]] = i;
for (int i = 1; i <= n; i++) {
t1[i] = Tsum(n)-Tsum(a[i]);
ans += t1[i];
Tadd(a[i]);
}
memset(t, 0, sizeof(t));
for (int i = n; i; i--) {
t2[i] = Tsum(a[i]-1);
Tadd(a[i]);
}
while (m--) {
int x = gi(), w = id[x];
printf("%lld\n", ans);
ans -= (t1[w]+t2[w]);
ans += query(w-1, x+1, n);
ans += query(n, 1, x-1)-query(w, 1, x-1);
insert(w, x);
}
return 0;
}

洛谷 P3157 [CQOI2011]动态逆序对(树套树)的更多相关文章

  1. 洛谷 P3157 [CQOI2011]动态逆序对 解题报告

    P3157 [CQOI2011]动态逆序对 题目描述 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n ...

  2. 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治

    题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...

  3. 洛谷P3157 [CQOI2011]动态逆序对

    题目大意: 给定\(1\)到\(n\)的一个排列,按照给定顺序依次删除\(m\)个元素,计算每个元素删除之前整个序列的逆序对数量 基本套路:删边变加边 那么我们不就是求满足\(pos_i<pos ...

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

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

  5. P3157 [CQOI2011]动态逆序对

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

  6. P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)

    P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...

  7. BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组

    BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一 ...

  8. [Luogu P3157][CQOI2011]动态逆序对 (树套树)

    题面 传送门:[CQOI2011]动态逆序对 Solution 一开始我看到pty巨神写这套题的时候,第一眼还以为是个SB题:这不直接开倒车线段树统计就完成了吗? 然后冷静思考了一分钟,猛然发现单纯的 ...

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

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

随机推荐

  1. css一div内文字居中

    在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中 ...

  2. Sublime Text notes

    1. 设置在窗口右下方显示文件的编码,在user preferences里加上以下的配置 2.设置用新标签页打开新文件而不是用新窗口打开,将以下配置改为false(默认为true)

  3. 10.LIKE 操作符

    LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. LIKE 操作符 LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. SQL LIKE 操作符语法 SELECT colum ...

  4. Luogu 4841 城市规划

    BZOJ 3456 权限题 太菜了推不出式子 我们设$f(n)$表示$n$个点的无向连通图的数量,那么有 $$f(n) = 2^{\binom{n}{2}} - \sum_{i = 1}^{n - 1 ...

  5. ShopNc实例化对象

    1.模型 $model_member = Model('member'); 2.接口 require_once BASE_ROOT_PATH.'/member/api/smiMember/action ...

  6. Windows下用Nginx配置遇到的问题

    Nginx是一款轻量级的web服务器/反向代理服务器,更详细的释义自己百度了.目前国内像新浪.网易等都在使用它.先说下我的服务器软件环境: 系统:Windows Server + IIS + ngin ...

  7. Quartus II 14.0正式版 下载链接和破解器

    Windows版本 必装组件: Quartus II http://download.altera.com/akdlm/software/acdsinst/14.0/200/ib_installers ...

  8. (转)jquery仿天猫商城左侧导航菜单

    原文地址:http://www.cnblogs.com/WinKi/p/3398824.html 之前看到有博友写了一个仿天猫商城左侧导航菜单,可惜不提供免费下载,也没有代码.以前自己也写过类似的效果 ...

  9. 编写高质量代码改善C#程序的157个建议——建议24:迭代器应该是只读的

    建议24:迭代器应该是只读的 如果注意观察会发现,FCL中的迭代器只有GetEnumerator方法,没有SetEnumerator方法,所有的集合类也没有一个可以写的迭代器属性.原因有二: 一:这违 ...

  10. Android下拉选择框之PopupWindow

    1.效果图 2.思路分析 1.点击弹出对话框 popupwindow 2.对popupwindow进行相关设置,popupwindow中设置view为listview 3.listview中item设 ...