2019暑训 Day1 低级数据结构

7月1号的内容7月2号才补…
不能拖了 再拖越来越没有机会补博客了

Day 1

  1. 利用快排的思想可以在O(n)下求出有序序列的中位数。
  2. 一道例题,留坑待补。

例题

这里是引用

3.stl库里的一些容器

在这里插入图片描述

堆、栈:不如手写
双端队列 deque
优先队列 priority_queue 内部实现:二叉堆

在这里插入图片描述

映射map、可重集合multiset、可重映射multimap

4.常用的一些算法

排序:
sort
stable_sort 稳定排序

查找:
在这里插入图片描述

对序列一些操作:
在这里插入图片描述
fill函数的实现就是循环,能压代码但不如memset能省时间
最后一个扰动函数可以规避出题人开一些卡你的数据,比如说快排等等。

删除相邻的重复元素,返回新的末尾
iter unique(first, last, [, pred]);

排列
在这里插入图片描述

VJ

A 作为一个栈的经典练习题是不错的

E 题目链接
这个题比较费力气,第一次做的时候想要类似于数独的填充,考虑最小个数的那一种颜色的彩珠,然后进行暴力…暴力…写下来也写了很久…其实在刚开始就应该算一下,复杂度是可能会到x * (1e6 - x) <= 25e10的(哪怕有10s也不够啊)…而且这题也一直wa…这种暴力办法放弃了。
晚上经过一定的点拨考虑到了deque,早上尝试写了一下,大体思路是这样的:因为长度会到2^32,所以对1e6个坐标进行存储,与此同时,用map<int, vector< int>> 记录下某一个坐标上有什么颜色的彩珠,这样子读入后就得到了一条1e6长的并且可以获取任意点上的珠子的颜色。然后,考虑两个指针pre, next,我们保证pre和next包围的连续序列就是在此时最短的长度。为此,我们要先进行初始化。将next不断前进,当前进到某一个点的时候(必定会小于N)可以保证此时包含了所有颜色的珠子,之后将pre试探性的前进:如果前进后kind减少了,那么停止前进,并且pre退回;如果没有减少,继续上述试探性的前进。当然了pre也不可能超过next,只用保证next不越界就可以保证pre不越界。初始化完成后,next前进一个,pre试探性的走到最前方,同时读取每一次的长度,更新ans的最小值。这样子时间复杂度是O(1e6),理论上是可以的了。虽然我最后还是wa了…过一阵子我再把e给a掉

另外有一个c++的问题…当时暴力找位置的时候,用了lower_bound和upper_bound,返回的类型不会搞…后来coolwx告诉我是vector< int>:: iterator 可以是可以了(编译器dev和oj都不让我auto和decltype!)之后就从ce到wa和tle…不过还是要长个教训 为了这个地方我花了起码1个小时…以后要是用到不熟悉的函数不如一开始就自己手撸,并且要见多识广、稍微多学习一点C++的知识。


7月16号

E
实在拖了好久才开始补这题…最开始用了map和vector,建立了一个位置与彩珠种类的双射关系,后来居然t了…这么看起来把1e9映射到1e6的范围上复杂度也是相当高的,至少是100的数量级。AC方法是用结构体存储每一个彩珠的位置及其颜色,对这个结构体进行双端遍历即可。这样子做尽管位置会在结构体中发生重复,但是不影响我们的答案,与其同时,结构体也会使复杂度骤降,保证了最多只有O(1e6)。


8月14号
STL中的map和unordered_map选择
unordered_map查询的时间复杂度大大少于map,是因为map实现原理是红黑树,而unordered_map是hash表,所以在数据范围不太大的时候可以多用unordered_map少去一个log的时间级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值