POJ2352 线状数组与超时

2023-11-11 12:32
文章标签 数组 超时 线状 poj2352

本文主要是介绍POJ2352 线状数组与超时,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这道题本身不难,就是一个线状数组求逆序数的简化。一开始没看清题,题目是按升序输入的,先按y在按x已经升序输入了,所以只要考虑x的大小即可,那么简单,直接线状数组走起。但是这里我第一次碰到了做ACM最不愿意碰到的事–超时,上网查了一下,发现算法明明一样,但他们的能过,最后终于发现了问题和解决方案。

因为不需要离散化,update中不能到n,那么就干脆一直计算到maxn,所以这里是要花很多的时间的,那么问题就在:当x=1,从1到maxn都要+1,可以想见这边时间爆炸了,所以这边导致超时。
那么网上的解决方案是:反正就是求个相对大小的比较,所以只要所有的输入值都变大,最后结果应该是不变的,那么就每一个输入都+1,最小也是从2开始,那么就减小了很大一部分时间,因为前面的那个影响后面的是比较多的。
因为我们数组一般习惯开的稍微大一些,所以,比如我maxn取32005,那么后面就可以从6开始,不影响结果,但如果从11开始就不行了。
这应该是算树状数组避免超时的一个小技巧,还是有必要记一下的(适用于一个个输入计算时,一开始全部输入再计算可以用maxN与输入值比较算出输入的最大值在update中使用,也可以减少时间)

代码如下:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;const int maxn =32005;
int n;
int c[maxn];int lowbit(int k)
{return k&(-k);
}
void update(int t)
{while (t <= maxn){c[t] ++;t += lowbit(t);}
}int getsum(int t)
{int sum=0;while (t >= 1){sum += c[t];t -= lowbit(t);}return sum-1;//计算时把自己算上了,所以-1
}int main()
{int i;int x, y;int num[maxn];while (~scanf("%d", &n)){memset(num, 0, sizeof(num));memset(c, 0, sizeof(c));for (i = 1; i <= n; i++){scanf("%d%d", &x, &y);x+=5; //关键在这一句update(x);num[getsum(x)]++;}for (i = 0; i < n; i++)printf("%d\n", num[i]);}return 0;
}

这篇关于POJ2352 线状数组与超时的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

Java中实现订单超时自动取消功能(最新推荐)

《Java中实现订单超时自动取消功能(最新推荐)》本文介绍了Java中实现订单超时自动取消功能的几种方法,包括定时任务、JDK延迟队列、Redis过期监听、Redisson分布式延迟队列、Rocket... 目录1、定时任务2、JDK延迟队列 DelayQueue(1)定义实现Delayed接口的实体类 (

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu