UVA-11990 动态逆序对

数据结构学习——动态逆序对 解法一: 分块套BIT利用树状数组算最初的逆序对个数 nlognnlogn 利用树状数组算出块中比x小的数的个数 lognlogn 遍历x所在的那个块 n/Sn/S 总复杂度O(m(n/S+Slogn)+nlognm(n/S+Slogn)+nlogn) S取nlogn−−−−−√\sqrt{nlogn}时 O(mnlogn−−−−−√+nlogn)m\sqrt{nlogn}+nlog 阅读详情




题目链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3141


题目大意:

给出一个1-n的排列A,要求按照某种顺序删除一些数(其他数顺序不变),输出每次删除之前逆序对的数目。


解题思路:

动态逆序对,在线的话用块状数组、树套树等高级数据结构解决,然此题可离线,于是可用cdq分治这种淫技奇巧代替。

先用树状数组求出序列原本的逆序对数,去掉某一个数就要减去前面比它大的数的个数以及后面比它小的数的个数,但是去掉一个数后会对其后面的操作产生影响,所以需要计算每次去掉一个数之前去掉的数中,在该数前比该数大的以及在该数后比该数小的,这样操作间构成了一种三维的偏序关系,cdq分治解之。


AC代码:

import java.util.*;

public class Main {
	static int n,m;
	static long ans;
	static int[] aa=new int[200005];
	static int[] bb=new int[200005];
	static int[] cc=new int[100005];
	static int[] dd=new int[100005];
	static int[] mm=new int[200005];
	static int[] bit=new int[200005];
	static Pair[] pp=new Pair[100005];
	static void add(int i,int x)
	{
		for(;i<=n;i+=i&-i)
			bit[i]+=x;
	}
	static int sum(int i)
	{
		int res=0;
		for(;i>0;i-=i&-i)
			res+=bit[i];
		return res;
	}
	static void cdq(int l,int r)
	{
		if(l==r) return;
		int mid=(l+r)/2;
		cdq(l,mid);
		for(int i=l;i<=r;i++)
			pp[i]=new Pair(cc[i],mm[cc[i]],i);
		work(l,r);
		for(int i=l;i<=r;i++)
			pp[i]=new Pair(mm[cc[i]],cc[i],i);
		work(l,r);
		cdq(mid+1,r);
	}
	static void work(int l,int r)
	{
		int mid=(l+r)/2;
		Arrays.sort(pp,l,r+1);
		for(int i=l;i<=r;i++)
		{
			if(pp[i].z<=mid)
				add(pp[i].y,1);
			else
				dd[pp[i].z]+=sum(pp[i].y);
		}
		for(int i=l;i<=r;i++)
			if(pp[i].z<=mid) add(pp[i].y,-1);
	}
	static class Pair implements Comparable<Pair>
	{
		int x,y,z;
		Pair(int a,int b,int c)
		{
			x=a;y=b;z=c;
		}
		public int compareTo(Pair p) {
			return p.x-x;
		}
	}

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		while(in.hasNext())
		{
			n=in.nextInt();m=in.nextInt();
			for(int i=1;i<=n;i++)
			{
				aa[i]=in.nextInt();
				mm[aa[i]]=i;
			}
			ans=0;
			for(int i=n;i>0;i--)
			{
				bb[i]=sum(aa[i]);
				ans+=bb[i];
				bb[i]+=i+bb[i]-aa[i];
				add(aa[i],1);
			}
			Arrays.fill(bit,0);
			for(int i=1;i<=m;i++)
				cc[i]=in.nextInt();
			Arrays.fill(dd,0);
			cdq(1,m);
			for(int i=1;i<=m;i++)
			{
				System.out.println(ans);
				ans-=bb[mm[cc[i]]]-dd[i];
			}
		}
	}
}


新手避坑指南:用PIC16F15355开发板和MCC完成第一个UART通信项目 本文为新手提供了使用PIC16F15355开发板和MPLAB代码配置器(MCC)实现首个UART通信项目的完整指南。通过图形化配置系统时钟、UART参数并自动生成驱动代码,手把手教学如何避开常见陷阱,快速完成从环境搭建、代码编写到调试输出的全流程,助力开发者高效入门PIC单片机开发。 阅读详情

相关推荐

混沌系统在图像加密中的应用(随机性测试之FIPS 140-2测试和SP800-22测试)

本节内容我们将学习混沌序列的随机性测试,那么前面讲了,混沌系统产生的随机序列,它的随机性到底好不好,除了看相图、分岔图、指数图以外,还有一个非常重要的指标,那就是FIPS 140-2测试和SP800-22测试。(1)保证密码学模块的安全性:密码学模块在加密和解密敏感信息时使用随机数生成器来增加对手动解密和猜测攻击的抵抗力。通过进行FIPS 140-2测试,可以验证密码学模块是否符合安全标准,确保其实施和设计的安全性,以有效地保护敏感信息。

weixin_42207434的博客 2085

动态逆序对

题目链接 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删 除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数 Input 输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数。 以下n行每行包含一个1到n之间的正整数,即初始排列。 以下m行每行一个正整数,依次为每次删除的元素。 N<=100000 M<=50000 Output 输出包含m行,依次为删除每个元素之前

qq_45778406的博客 652

数据集分享 | IWR1642呼吸心跳数据集

雷达开源数据库 数据集

【调皮连续波】雷达技术领域知识博主 3205

动态逆序对两种做法

动态逆序对两种做法

HHSSASS的博客 368

STM32CubeMX和华为LiteOS Studio开发STM32

传统的STM32的开发通常使用Keil/IAR这类开发软件,随着物联网时代的到来,传统嵌入式的发展不断向物联网方向靠拢,而Keil/IAR这类开发软件无法满足IoT一站式的开发,华为LiteOS Studio结合STM32CubeMX可以快速,高效地进行物联网开发,本文提供一种开发思路及环境的配置方法。...

weixin_45680600的博客 2833

YOLOv8实战火焰和烟雾检测 (视频教程)

本课程将手把手地教大家使用YOLOv8结合可变形卷积(deformable convolution)训练火焰和烟雾数据集,完成一个多目标检测实战项目,可实时检测图像、视频、摄像头和流媒体(http/rtsp)中火焰和烟雾,并提供可视化演示界面 。

bai666ai的博客 1917

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

题面题目描述对于给定的一段正整数序列,我们定义它的逆序对的个数为序列中ai>aj且i输入输出格式输入格式:第一行,两个数n,m,表示序列中有n个数,要删去m个数第二行n个数,表示给定的序列。第三行m个数,第i个数di表示要删去原序列中的第di个数。输出格式:一行m+1个数。第一个数表示给定序列的逆序对组数,第i+1个数表示删去第di个数后序列的逆序对组数(删去的数不再恢复)输入输出样例输入样例#1:

小蒟蒻yyb的博客 1010

Xtract or Ucfyber的最条理的整理入门级教程

XTRACT可以对任意截面进行全过程截面分析。工程中常用来分析各种截面(如异形柱、组合截面等)的非线性特征点及承载力校核。 xtract主要思路也是根据各种材料本构关系,基于平截面假定,用fiber划分截面进行全过程非线性分析。......

→★佐佑思维★← 8402

动态逆序对,记校赛怨念

上周末的校赛决赛,A题是一道动态逆序对,这本是一道省选难度的模板题,P1393 动态逆序对 但因为数据过水,被我们暴力切了(在这里感谢sugar大佬)。 那么一道动态逆序对的正解究竟是什么呢?我们不能被人按在地上摩擦还最后还一无所知吧。经过一段时间的研究后,算是有所领悟,我决心做一点笔记。 什么是逆序对?? 对于给定的一段正整数序列,逆序对就是序列中 ai > aj 且 i < j...

fatdog_jo的博客 300

工业视觉光源频闪控制的三种核心模式与选型实战

本文深入解析工业视觉系统中光源频闪控制的三种核心模式:光源主控、相机主控与硬同步。针对高速飞拍、缺陷检测等场景,详细对比了各模式的时序原理、硬件要求与适用场景,并提供了基于产线速度与检测需求的实战选型指南,帮助工程师有效消除运动模糊、提升成像质量与系统稳定性。

weixin_29299807的博客 439

【学习系列】SAP RAP 18:Unmanaged场景开发示例-基本数据更新

本文介绍了在SAP RAP中unmanaged模式下从0到1的开发步骤。unmanaged模式下需要自行实现数据更新、权限检查等逻辑,适用于操作现有数据库表或复杂业务场景。文章以两层的采购订单对象为例,详细说明了创建技术对象(表、视图、行为定义等)的过程,并重点阐述了如何实现CRUD相关方法的核心逻辑。通过创建缓冲类来处理交互阶段和保存阶段的数据操作,确保事务一致性。完整代码展示了抬头层级的增删改查功能实现,为后续明细层级的开发奠定了基础。

DeveloperMrMeng的博客 641

【题解】【uva11990】【bzoj3295】动态逆序对 ``Dynamic'' Inversion

对于序列A,它的逆序对数定义为满足ij,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。 题解: 首先我们可以想到这样的做法:先求出原有的逆序对的数量,然后每删除一个元素,计算删除掉的逆序对的数量。 方法是计算该元素前有多少个元素比它大,后面有多少个元素比它小即可。 但是如果暴力计算删除掉

ezoixx130's Blog 3635

代谢组数据分析(五):代谢组的功能富集分析

本文介绍了代谢组数据分析中的功能分析,包括代谢物富集分析、GSEA和ssGSEA方法。文章详细阐述了分析原理、应用背景、数据准备、统计方法以及结果解释,强调了在代谢通路和代谢物ID对应关系建立、差异代谢物筛选、富集程度计算等方面的关键步骤。通过这些方法,可以揭示差异代谢物在生物过程中的作用,为疾病研究和药物开发提供依据。

专注生信领域 5983

动态逆序对,Dynamic Inversion,Uva11990(树套树)

给一个1~n的排列A,要求按照某种顺序删除一些数(其他数顺序不变),输出每次删除之前逆序对的数目。所谓逆序对数,就是满足iA[j]的有序对(i,j)的数目 首先用O(nlogn)时间求出初始排列的逆序对数,则每次需要求出被删除的那个数左边有多少个数比它大,右边有多少个数比它小。 TLE的代码,忧伤。。。 #include #include #include #incl

fsdcyr 661

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

[Uva 11990] "Dynamic" Inversion (CDQ分治入门)

Uva - 11990 动态逆序对,求删除一个点之前序列中逆序对的个数 首先倒过来看这个问题,把点先全部删掉 然后从最后一个点开始倒着往数列中加点 求加完这个点逆序对的变化CDQ分治做法把删除时间看作 t,下标看作 x,值看作 y 然后对 x排序,对 t偏序,用树状数组维护 y 具体来说就是对于每个点 (t0,x0,y0)(t_0, x_0, y_0) 先统计 t<t0,x<x0,y>

MisDeer's blog 782

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

uva 11990(动态逆序对)

题目链接     刘汝佳的数据结构专场题目, 题目就是给定一个1~n的排列求删除某个数后剩下的逆序对的个数, 我 一开始的做法是树状数组套Treap后来T了, 又翻了白书, 白书上的解法是用到了一个静态的BST,因为这 题的特殊性, BST只需要有删除动能, 所以再用Treap就显得大才小用了, 而且用静态的常数也小了很多,  套Treap总的复杂度是(n + q) * log(n) *

一个人的生活 1894

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

uva11990 动态逆序对

这题说的是给了一个数组,按照他给的顺序依次删除数,在删除之前输出此时的逆序对个数 我们用Fenwick树 维护这整个数列, C[i]是一个 treap的头, 管理了在树状数组中 能影响他的点,然后我们用名次树去计算 在C[i]下小于等于要删除的那个数的个数就ok了。 #include <iostream> #include <algorithm> #incl...

weixin_30535913的博客 86

UVA 11990 ``Dynamic'' Inversion 动态逆序对

``Dynamic'' Inversion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;page=show_problem&amp;problem=3141 Description Yo...

weixin_34319640的博客 157

UVA11990 ``Dynamic‘‘ Inversion

本文探讨了UVA11990动态逆序对问题的三种解法:CDQ分治、嵌套(本题是树状数组套BST)、分块。题目要求对1~n排列动态删除元素时,实时计算剩余逆序对数。CDQ分治通过三维偏序处理删除时间和元素位置值的关系,而树状数组套BST利用嵌套数据结构高效维护前缀查询。两种方法的时间复杂度均为O(n log²n),适用于大规模数据。

hlhgzx的博客 1119

[Uva 11990] "Dynamic" Inversion (二维分块)

Uva - 11990 动态逆序对,求删除一个点之前序列中逆序对的个数 首先倒过来看这个问题,把点先全部删掉 然后从最后一个点开始倒着往数列中加点 求加完这个点逆序对的变化分块做法,把下标看成 x,值看成 y 这样就变成了平面上的点, 将平面分成 bsiz∗bsizbsiz*bsiz,bsiz=N‾‾√bsiz=\sqrt{N} 加入一个点的时候,在它左上方区域的和右下方区域中的点的数

MisDeer's blog 1004

spoj 861 SWAPS & uva 11990 "Dynamic'' Inversion(动态维护逆序对)

题意:有150000个数,10000条操作,每次将第i个数变为x,讯问每次操作后逆序对的数目。 解法1:树状数组+treap,树状数组的每个元素都是一棵树,这样可以在lognlogn时间内查询前i项有多少个小于等于k的元素,当某个元素法师改变时,只需从树状数组中对应的treap中进行元素的删减,每次修改前后统计的第i个元素形成的逆序对数,便可知每次操作后逆序对的数目。由于Treap常熟很

新博客地址:sensirly.github.io 2260

[BZOJ3295/Luogu3157/UVA11990][CQOI2011]动态逆序对(``Dynamic'' Inversion) 题解

题目链接: BZOJ3295 Luogu3157 UVA11990 \(Wa\)毒瘤数据结构为什么卡常啊。。 首先,对于刚开始的逆序对数很好求,树状数组/归并排序都行。 对于删除一个数,如果左边有\(a\)个数比它大,右边有\(b\)个比它小,那么就是减去了\((a+b)\)个逆序对。 那么对于这种问题,可以用树状数组套线段树解决。 树状数组的每个区间是一颗权值线段树。 那么这个问题就愉...

weixin_30644369的博客 94

Uva 11990 ``Dynamic'' Inversion(分桶法+平方分割)

题目链接 Uva 11990 “Dynamic” Inversion 动态的逆序对问题。分析可以把(i,A[i])(i,A[i])映射到平面上,这样的话映射到的平面是[0,200000]X[0,200000], 这样对于一个点(i,A[i])(i,A[i]),来说,平面区域的左上方,及右下方就是能和这个点构成逆序对的点。 显然用数组储存肯定是不行的,考虑对平面分桶,分成n1/2∗n1/2n^

taotao 的大学墓志 849

UVA11990 ``Dynamic'' Inversion (树状数组套平衡树)

``Dynamic'' Inversion Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 11990 64-bit integer IO format: %lld      Java class name: Main Prev Sub

u013268685的专栏(有一种幸福叫AC,有一种期待叫AK) 1543
上一篇: HDU-5324 cdq分治
下一篇: HDU-5893 树链剖分+区间合并
AC_Machine
博客等级 码龄11年 1粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值