树状数组+离散化求逆序数poj2299Ultra-QuickSort

gesp c++ 五级知识点 阅读详情

Description

In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence
9 1 0 5 4 ,

Ultra-QuickSort produces the output
0 1 4 5 9 .

Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.

Input

The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.

Output

For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.

Sample Input

5
9
1
0
5
4
3
1
2
3
0

Sample Output

6
0

逆序数就是数中各位在它前面有多少个数比它大,求出这些元素个数之和。

 

今天看了个树状数组,可以很好的解决这个问题,普通方法需要O(N^2)复杂度,用树状数组只需要O(NlongN)

 

树状数组实际上还是一个数组,只不过它的每个元素保存了跟原来数组的一些元素相关的结合值。

若A为原数组,定义数组C为树状数组。C数组中元素C[ i ]表示A[ i –lowbit( i ) + 1]至A[ i ]的结合值。

lowbit(i)是i的二进制中最后一个不为零的位数的2次方,可以这样计算

lowbit(i)=x&(-x)

lowbit(i)=x&(x^(x-1))

 

 

 

当想要查询一个sum(n)时,可以依据如下算法即可:

step1: 令sum = 0,转第二步; step2: 假如n <= 0,算法结束,返回sum值,否则sum = sum + Cn,转第三步; step3:  令n = n – lowbit(n),转第二步。

n = n – lowbit(n)这一步实际上等价于将n的二进制的最后一个1减去。而n的二进制里最多有log(n)个1,所以查询效率是log(n)的。

 

修改一个节点,必须修改其所有祖先,最坏情况下为修改第一个元素,最多有log(n)的祖先。所以修改算法如下(给某个结点i加上x):

step1: 当i > n时,算法结束,否则转第二步; step2: Ci = Ci + x, i = i + lowbit(i)转第一步。

i = i +lowbit(i)这个过程实际上也只是一个把末尾1补为0的过程。

 

求逆序的思路:

 

可以把数一个个插入到树状数组中, 每插入一个数, 统计比他小的数的个数,对应的逆序为 i- getsum( data[i] ),其中 i 为当前已经插入的数的个数, getsum( data[i] )为比 data[i] 小的数的个数,i- getsum( data[i] ) 即比 data[i] 大的个数, 即逆序的个数。最后需要把所有逆序数求和,就是在插入的过程中边插入边求和。

 

下面是代码:

 
#include 
  
     
#include 
   
      
#include
    
     
#include
     
      
using namespace std;  
struct  lisan{
	int a;
	int i;
}a[500005];
int b[500005],tree[500005];
int read(int k)
{  
    int sum=0;  
    while(k)  
    {  
        sum+=tree[k];  
        k-=k&-k;
    }
    return sum;
}  
void add(int k,int num,int n)  
{  
    while(k<=n)  
    {  
        tree[k]+=num;  
        k+=k&-k;  
    }  
} 
bool cmp(lisan a,lisan b){  
    return a.a
      
     
    
   
  
S/4中的16种特殊库存类型 阅读详情

相关推荐

连接HP C7000 OA管理口操作文档

必备工具:1台便携式笔记本电脑、1根网线 2、 在C7000机箱背面找到 OA管理模块,如图:图标1和2为OA主备管理模块 将网线一端接至左边的OA管理网口,另一端接至便携式笔记本电脑网口,如图下位置: 在C7000液晶面板下查看OA管理口地址,如图,按下液晶面板的OK按钮 然后按下▼按钮调至Enclosure Info这一项后,按下OK按钮,输出界面如图:可以看到当前Active的OA管理口IP地址 比如显示地址为172.16.25.30,则个人笔记本电脑则配置172.16...

马晓援的博客 6013

离散化+树状数组求逆序数

题目:POJ2299   离散化是一种常用的技巧,有时数据范围太大,可以用来放缩到我们能处理的范围 因为其中需排序的数的范围0---999 999 999;显然数组不肯能这么 大;而N的最大范围是500 000;故给出的数一定可以与1.。。。N建立一个一一映射; 这里用一个结构体 struct Node  {       int v,order;  }p[510000];和一个数组

ACdreamer 7230

OCR模型轻量化新思路:用ONNX Runtime加速PP-OCRv4推理(附性能对比测试)

本文详细介绍了如何利用ONNX Runtime对PP-OCRv4模型进行轻量化部署与推理加速。通过模型导出优化、动态量化、线程绑定及内存复用等技巧,在树莓派、RK3588等边缘设备上实现了超过50%的性能提升,并显著降低了内存占用,为移动端OCR部署提供了完整的优化方案和实测数据对比。

weixin_29063979的博客 496

离散化加树状数组求逆序数。

【转自BLOG】点击打开链接 【1 POJ.2299】 离散化是一种常用的技巧,有时数据范围太大,可以用来放缩到我们能处理的范围 因为其中需排序的数的范围0--- 999999999;显然数组不肯能这么大;而N的最大范围是500000;故给出的数一定可以与1.。。。N建立一个一一映射;   这里用一个结构体 struct Node  {       int v,order;

I good vegetable a! 676

ros1 ubuntu22.04 安装教程

ROS1 ubuntu22.04 安装教程

autolabor的博客 9197

基于Java的OPC UA Server开发指南:从零开始构建高效服务器

本文介绍了如何使用开源项目org.eclipse.milo创建Java OPC UA Server。通过创建Spring Boot项目,添加Milo SDK依赖,定义Namespace类,服务器启动类以及监听器,详细阐述了建立OPC UA Server服务的步骤。启动后,服务器默认监听地址为opc.tcp://localhost:12685,可使用Softing OPC Client进行连接。

洛阳泰山的博客 3023

树状数组 离散化 求逆序数POJ 2299Ultra-QuickSort解题报告

树状数组 离散化 求逆序数POJ 2299Ultra-QuickSort解题报告

Dafang_Xu的博客 829

SAP_MM_配额安排_PA认证总结

配额安排是企业进行供应商管理的一种方式。通过配额管理,企业可以与多家供应商保持业务往来,以保证某些紧缺原材料的正常供货。此外,企业也可以通过不同的配额比例,提高供应商优化服务、降低价格的积极性。

java_zhong1990的专栏 1021

POJ 2299 Ultra-QuickSort (树状数组+离散化 求逆序数)

In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sor...

dddddd12345456的博客 168

【四足机器人项目实战】四足机器人嵌入式硬件设计

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、电源管理板设计及制作二、通讯中继板设计及制作三、力控无刷电机驱动板设计及制作1.磁场定向控制FOC控制原理2.电机转子位置、速度检测原理3.硬件CAN通讯原理 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对四足机器人–嵌入式硬件设计做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、电

qq_35635374的博客 1万+

【Arduino 动手做】构建一个迷你 Las Vegas RGB LED 球体

《Arduino迷你拉斯维加斯球体项目:15岁少年的创意挑战》 15岁的Ben通过本项目展示了如何利用Arduino平台制作一个经济实惠的迷你拉斯维加斯球体夜灯。该项目涉及LED选择(采用WS2812B可编程灯带)、电子元件配置(含Arduino Nano微控制器和红外遥控)以及3D建模设计(100毫米直径球体)。项目难点包括LED布局优化、供电方案设计和3D打印外壳制作。Ben详细记录了从背景研究、电路设计到最终实现的完整过程,特别强调了分辨率与成本的平衡,以及如何通过白色扩散器改善视觉效果。这个项目不仅

雕爷学编程 1024

poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)

poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)

1696

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(17-32)

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(17-32)

weixin_45735391的博客 12万+

POJ 2299 Ultra-QuickSort(树状数组+离散化+求逆序数)

In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted i...

H4ppyD0g的博客 303

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

poj 2299 Ultra-QuickSort(离散化+树状数组求逆序数)

Ultra-QuickSortTime Limit: 7000MS Memory Limit: 65536KTotal Submissions: 67585 Accepted: 25315DescriptionIn this problem, you have to analyze a particular sorting algorithm. The algorithm processes a ...

BBHHTT的博客 266

精雕软件(JDpaint) 5.5 绿色版

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

【树状数组--求逆序数(离散化)】poj2299 Ultra-QuickSort

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 61575   Accepted: 22868 Description In this problem, you have to analyze a particular sorti

Hi_jiaxinwei的博客 337

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【树状数组】poj2299 Ultra-QuickSort(离散化+树状数组求逆序数)

离散化+树状数组求逆序数

Gzbgreat的博客 341

POJ2299 Ultra-QuickSort 树状数组(求逆序数)+离散化

POJ2299 Ultra-QuickSort #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;algorithm&gt; #define lowbit(x) x&amp;-x//位操作 using namespace std; const int MAX=5*1e5+5; int aa[MAX],c[MAX],n...

Qianyri的博客 340

(树状数组求逆序数+离散化+归并排序求逆序数)POJ 2299 Ultra-QuickSort

问题:Ultra-QuickSort POJ - 2299多组数据,每组一个序列,n个元素(n不大于500000,每个元素不大于999,999,999),求按照冒泡排序排序,移动相邻两个元素的次数是多少?分析:实际就是求逆序数,题虽水,但是思路很棒,收获很大一、树状数组求逆序数+离散化树状数组的博客,看这个就够:https://blog.youkuaiyun.com/The__sea/article/deta...

勉強しているユキさんです 225

POJ - 2299 Ultra-QuickSort 解题报告(树状数组)(求逆序数)(离散化)

目录题目描述思路分析AC代码 题目描述 链接:https://vjudge.net/problem/POJ-2299 题意:给你一组数,你能做的操作是交换两个相邻的数,令这个数列变成递增的,要求最小操作数。 思路分析 说实话,看到这样的题,感觉我已经本能反应地想到了逆序数了。。不知道是不是最近看了点线代的缘故。。 具体分析起来是这样的: 5 9 1 0 5 4 以样例为例,我们一个一个的输入,那么...

nagisa2019的博客 326

poj2299 Ultra-QuickSort(树状数组求逆序数,离散化)

所谓数列的逆序数就是一个值sum,sum=b[0]+b[1]+...+b[n-1]。这里假设数列为a,其中b[i]表示在数列中在a[i]后面并且比a[i]小的数的个数。比如有数列 2 8 0 3的逆序数就是1+2+0+0=3。

Every day 614

poj 2299 Ultra-QuickSort 树状数组求逆序数 离散化

题目链接:http://poj.org/problem?id=2299题意:求逆序数题解:树状数组可以求逆序数 但是数据50w,所以要离散化。 归并也可做:http://blog.youkuaiyun.com/zxy_snow/article/details/6257561 这位大牛不知道什么叫离散化 写出了离散化 Orz “就排下序,重新编数,这个据说叫离散化 = =”另外一种离散化方式吧 ( 其实就是

yxg_123的博客 428

POJ2299 Ultra-QuickSort(树状数组求逆序数+离散化)

题意:给一个n个整数组成的序列,每次只能交换相邻的两个元素,问你最少要进行多少次交换才能使得整个整数序列上升有序。题解:      冒泡排序的交换次数等于数组中所有数的逆序数之和。逆序数可以用树状数组求出。具体操作:构建范围为1-n的树状数组,每次出现一次,该位置就加1,所以对于每个j,树状数组得到的前n项和就是满足i&lt;j,ai&lt;=aj的i的个数。从而可以用总的可以减去上面的个数,便可...

sgh666666的博客 366

POJ2299 Ultra-QuickSort——树状数组求逆序数+离散化

题目链接点击打开链接 题意:一个无序的

chenyuwen666的专栏 647

POJ 2299 Ultra-QuickSort (树状数组求逆序数+离散化)

Ultra-QuickSort Time Limit:7000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2299 Description In this problem, you have to analyze a part

sxk 935

poj 2299 Ultra-QuickSort(求逆序数:离散化+树状数组)

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 22147   Accepted: 7897 Description In this problem, you have to analyze a particular sorting algorith...

iteye_4729的博客 140
上一篇: POJ 2192 Zipper
下一篇: hdu 2037 今年暑假不AC题解
luckcircle
博客等级 码龄10年 13粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值