洛谷题单指南-线段树的进阶用法-P3157 [CQOI2011] 动态逆序对

news/2025/1/10 10:53:45/文章来源:https://www.cnblogs.com/jcwy/p/18658017

原题链接:https://www.luogu.com.cn/problem/P3157

题意解读:长度为n的序列,序列是1~n的排列,一共m个删除操作,每一个删除之前输出逆序对。

解题思路:

要计算静态的逆序对,可以通过树状数组、权值线段树等方式,时间复杂度都是O(nlogn)

要计算动态的逆序对,算上每一次删除,暴力做法需要O(mnlogn),需要优化

如果能知道删除的元素对逆序对的贡献,问题就好办了

要知道某个元素对逆序对的贡献,也就是要知道该元素前面有多个比小大,后面有多少比它小,显然是一个区间查询元素个数的问题

可以考虑建立n+1棵权值线段树,根节点为root[],第root[i]棵线段树维护序列a[1]~a[i]

那么要查询a[x]前面有多少个元素比它大,后面有多少个元素比它小,借助于前缀和思路

前面有多少个元素比它大:可以在root[x-1]的线段树中查询

后面有多少个元素比它小:可以在root[n]的线段树查询 - root[x-1]的线段树查询

如果要删除元素,比如删除a[x],则需要更新root[x]~root[n]所有线段树,这一步是需要优化,容易想到用树状数组套线段树来优化。

100分代码:

#include <bits/stdc++.h>
using namespace std;const int N = 100005;struct Node
{int L, R;int cnt;
} tr[N * 800];
int root[N], idx;
int pos[N]; //记录元素的位置
int n, m;
long long ans;int lowbit(int x)
{return x & -x;
}void pushup(int u)
{tr[u].cnt = tr[tr[u].L].cnt + tr[tr[u].R].cnt;
}//更新根为u的线段树v值加o
int update(int u, int l, int r, int v, int o)
{if(!u) u = ++idx;if(l == r){tr[u].cnt += o;return u;}int mid = l + r >> 1;if(v <= mid) tr[u].L = update(tr[u].L, l, mid, v, o);else tr[u].R = update(tr[u].R, mid + 1, r, v, o);pushup(u);return u;
}//在根为u的线段树中查询值在lv~rv范围的数量
int query(int u, int l, int r, int lv, int rv)
{if(lv > rv) return 0;if(l >= lv && r <= rv) return tr[u].cnt;else if(l > rv || r < lv) return 0;else{int mid = l + r >> 1;return query(tr[u].L, l, mid, lv, rv) + query(tr[u].R, mid + 1, r, lv, rv);}
}//利用树状数组更新root[pos]~root[n]线段树的v值数量,增加o
void add(int pos, int v, int o)
{for(int i = pos; i <= n; i += lowbit(i)){root[i] = update(root[i], 1, n, v, o);}
}//利用树状数组查询root[1]~root[pos]线段树中值在lv~rv范围的数量
int find(int pos, int lv, int rv)
{if(lv > rv) return 0;int res = 0;for(int i = pos; i; i -= lowbit(i)){res += query(root[i], 1, n, lv, rv);}return res;
}int main()
{cin >> n >> m;int x;for(int i = 1; i <= n; i++){cin >> x;pos[x] = i;//x对逆序对的贡献是前面比x大的元素个数ans += find(i - 1, x + 1, n);add(i, x, 1);}while(m--){cin >> x;cout << ans << endl;//删除x则减去x对逆序对的贡献,即减去x前面比x大的元素个数以及x后面比x小的元素个数ans -= find(pos[x] - 1, x + 1, n) + find(n, 1, x - 1) - find(pos[x], 1, x - 1);add(pos[x], x, -1);}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/867061.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】简单实现Http网络请求功能

1.安装uvicorn和FastAPI pip3 install uvicorn pip3 install FastAPI2.python代码实现 import uvicorn from fastapi import FastAPIapp = FastAPI() @app.post("/ShowNum") async def ShowNum(x:int=1,y:int=2):print(和为:%d % (x+y))return x+yif __name__ == &q…

JMeter自动执行生成报告,批处理脚本

1、新建文件后缀.bat: 字符集使用 ANSI 编码,不然有中文会乱码,执行失败2、输入内容如下,根据实际情况修改路径:@echo off REM 设置 JMeter 的安装目录,根据实际情况修改路径 set JMETER_HOME=C:\apache-jmeter-5.4.1 REM 设置测试计划的路径,根据实际情况修改路径 set T…

奇迹mu1.03单机版安装教程+无需虚拟机+GM工具

今天为大家带来一款怀旧网单《奇迹mu1.03》的游戏架设,适用于单机娱乐, 仅供怀旧,本人已经安装游戏成功,特此带来详细安装教程。 适用环境单机视频演示 https://githubs.xyz/show/330.mp4亲测截图 架设步骤 关闭默认杀毒软件和其它自己下的杀毒软件 ,一定要检查关闭!!…

Toeplitz矩阵

具有下面形式的矩阵称为 Toeplitz 矩阵 (即在同一条对角线上的元素都相等) • Toeplitz 矩阵只有 2n − 1 个独立元素, 因此在存储一个 Toepliz 矩阵时, 只需存储第一列和第一行 (或第一列和最后一列);• 如果 T 对称, 则只需存储第一列. 用途:

【转载】【cursor】解决 cursor IDE 不能正常给 python 代码高亮的问题

原文链接:How to use python with the Cursor IDE首先参照上面的解决方法进行配置,配置完成后若不生效,请检查:1. 在 cursor 中把本地和远程的 python 扩展设置都进行以下修改 2. 若修改后不生效,重启 python 插件(看不明白的话请留言)

2025 年,程序员如何找准技术“掘金点”?

大家好,我是 V 哥,最近有很多小伙伴来问V哥,悲催的2024终于过去了,有的早早就给自己放假等春节了,有的也没逃过临了被约喝咖啡☕️,都想着先过完年再考虑怎么办,躺平可不行,又有谁会跟钱过不支呢。2025 年,V 哥也跟一些行业大佬聊过,共同的一个点就是市场经济依然不会…

基于ODX的工程诊断仪 - DST.Tester

INTEWORK-DST(Tester Option,以下简称DST.Tester)是经纬恒润自主研发的工程诊断仪,适用于新车型和ECU的诊断和刷写。DST.Tester不仅支持多种ISO协议,也可以按照客户需求开发刷写流程,满足整车厂和零部件供应商的诊断工程师使用需求。概述INTEWORK-DST(Tester Option,以下简…

JS-25 字符串方法_indexOF()

indexOf方法用于确定一个字符串再另一个字符串中第一次出现的位置,返回结果是匹配开始的位置。如果返回-1,就表示不匹配 hello world.indexOf(o)//4 hello world.indexOf(a)//4-1 床前明月光,疑是地上霜。一去二三里,举头望明月,低头思故乡。.indexOf("一去二三里&qu…

点特征直方图

对点特征的描述常见的描述手段有,曲率、法线等,由于点云散乱无序形态各异,即使人眼是判别特征与非特征点都极其困难,所以仅仅凭借曲率、法线来对点云特征进行描述,显然是不够的。那如何准确或者全面的去描述点的特征呢,这也是很多算法的基石,特征描述准确与否直接会影响…

高斯金字塔,高斯模糊,高斯差分

高斯金字塔、高斯模糊和高斯差分是图像处理中非常重要的技术,常用于图像缩放、降噪、特征提取等领域。 1. 高斯模糊(Gaussian Blur) 高斯模糊是一种降噪技术,基于高斯函数的图像处理技术,用于平滑图像,减少噪声或细节。它在图像处理和计算机视觉中非常常用,尤其是在预处…

改造应用从容器tomcat迁移到pas(信创容器中间件)的适配工作

背景 近年来由于信创要求的重视,软件国产化越来越要提上日程了,相信在相关行业的人已经有很多开始在准备信创相关适配改造工作了吧 我们公司也一样,经过2个月的研究终于算是把我们的主要产品改造成功,下面我就介绍下: 我们无源代码的tomcat容器应用如何迁移到普元Pas 正文…