hdu1394(线段树点更新的应用)

2024-09-09 17:32

本文主要是介绍hdu1394(线段树点更新的应用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:求一个序列经过一定的操作得到的序列的最小逆序数

这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1)

知道上面的知识点后,可以用暴力来解

代码如下:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>#define N 50005
#define inf 0x7ffffff
#define eps 1e-9
#define pi acos(-1.0)
#define P system("pause")
using namespace std;
int a[N],num[N];
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);int n;while(scanf("%d",&n) != EOF){int i, j;for(i = 0; i < n; i++)scanf("%d",&a[i]);memset(num,0,sizeof(num));int res = 0;for(i = 1; i < n; i++){for(j = 0; j < i; j++)if(a[i] < a[j])num[i]++;res += num[i];}int minn = res;for(i = 0; i < n-1; i++){res = res-a[i]+n-1-a[i];//cout<<res<<endl;if(res < minn) minn = res;}printf("%d\n",minn);}return 0;
}
但是这题用线段树解,时间可以优化很多

思路入下:

这里的线段树只用来求逆序数,依次输入一个数据a,a所在的区间都加1,然后查询[ a , n ]上的sum,这就是a的逆序数

为了方便理解,最好自己举个例子

代码如下:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>#define N 50005
#define inf 0x7ffffff
#define eps 1e-9
#define pi acos(-1.0)
#define P system("pause")
using namespace std;
int a[N],c[N];
struct node
{int l,r,sum;
}tree[N*4];
int res;
void build(int o,int l,int r)
{tree[o].l = l;tree[o].r = r;if(l == r){tree[o].sum = 0;return ;}int m = (l + r)/2;build(2*o,l,m);build(2*o+1,m+1,r);tree[o].sum = tree[2*o].sum + tree[2*o+1].sum;
}
void insert(int o,int k)
{if(tree[o].l == tree[o].r){tree[o].sum = 1;return;}int m = (tree[o].l+tree[o].r)/2;if(k <= m) insert(2*o,k);if(k > m) insert(2*o+1,k);tree[o].sum = tree[2*o].sum + tree[2*o+1].sum;
}
void query(int o,int x,int y)
{if(x <= tree[o].l && tree[o].r <= y){res += tree[o].sum;return;}int m = (tree[o].l + tree[o].r)/2;if(x <= m)query(2*o,x,y);if(y > m)query(2*o+1,x,y);
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);int n;while(scanf("%d",&n) != EOF){int i,ans = 0;build(1,1,n);for(i = 0; i < n; i++){scanf("%d",&a[i]);insert(1,a[i]+1);res = 0;query(1,a[i]+2,n);c[i] = res;ans += c[i];}int minn = ans;//cout<<ans<<endl;for(i = 0; i < n-1; i++)//把n-1个数字依此移到最后{ans = ans - a[i] + (n-a[i]-1);//每个数依此移到最后得到的逆序数//  cout<<ans<<endl;if(minn > ans)minn = ans;}printf("%d\n",minn);}return 0;
}








这篇关于hdu1394(线段树点更新的应用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1151816

相关文章

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA