[LOJ#10042] 收集雪花
题目链接:###
题目分析:###
双指针扫描可以保证在\(O(n)\)的时间复杂度内处理这道题。另外,虽然这个题标签是\(hash\),但是字符串\(hash\)是可以卡掉的,所以建议直接离散化。
维护两个指针\(l\)和\(r\),并维护一个\(bool\)数组记录在当前区间内某个数是否出现过。\(r\)指针右移并记录区间长度,当\(bool[r]=true\)时说明\(a[r]\)重复出现过了,这时将\(l\)指针右移到\(a[r]\)上次出现的位置,并更新\(ans\)。
一般地,对于需要将数字映射到有限空间的情况,离散化远远比字符串哈希更为稳妥。
2019.8.3 UPD:前两天写Oil的时候了解到双指针扫描其实有一个专门的名字,叫尺取法,是个普及知识点。但是双指针扫描在不合法情况时就直接丢掉的策略很多时候对程序优化有奇效,而且是一种比较灵活的写法(其实就是靠脑补……),反正蛮神奇的,思想可以学习
代码:###
#include <bits/stdc++.h>
#define N (1000000 + 5)
using namespace std;
inline int read() {
int cnt = 0, f = 1;
char c;
c = getchar();
while (!isdigit(c)) {
if (c == '-')
f = -f;
c = getchar();
}
while (isdigit(c)) {
cnt = cnt * 10 + c - '0';
c = getchar();
}
return cnt * f;
}
int n, a[2 * N], b[2 * N], l = 1, r, cnt, ans;
bool flag[N];
void Discretize() { //离散化
sort(b + 1, b + n + 1);
int q = unique(b + 1, b + n + 1) - b;
for (register int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + q + 1, a[i]) - b;
}
int main() {
memset(flag, false, sizeof(flag));
n = read();
for (register int i = 1; i <= n; i++) b[i] = a[i] = read();
Discretize();
// for(register int i=1;i<=n;i++) cout<<a[i]<<" ";
for (r = 1; r <= n; r++) {
if (!flag[a[r]])
ans = max(ans, ++cnt);
else {
while (a[l] != a[r]) {
flag[a[l]] = false;
l++;
}
++l;
cnt = r - l + 1;
}
flag[a[r]] = true;
}
printf("%d", ans);
return 0;
}
[LOJ#10042] 收集雪花的更多相关文章
- 「LOJ#10042」「一本通 2.1 练习 8」收集雪花 (map
题目描述 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集的过程中,同学们不希望 ...
- #10042. 「一本通 2.1 练习 8」收集雪花 || 离散化 || 双指针法 || C++ || LOJ
题目:#10042. 「一本通 2.1 练习 8」收集雪花 看到网上没有这道题的题解,所以写一下. 要标记数字是否存在,看到x<=1e9,所以考虑用离散化,然后开一个last数组,last[i] ...
- 【hash表】收集雪花
[哈希和哈希表]收集雪花 题目描述 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有n个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集 ...
- 收集雪花(map)
题目描述 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有n个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集的过程中,同学们不希望有重 ...
- LOJ10042 收集雪花
题意 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集的过程中,同学们不希望有重 ...
- loj题目总览
--DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...
- CSU训练分类
√√第一部分 基础算法(#10023 除外) 第 1 章 贪心算法 √√#10000 「一本通 1.1 例 1」活动安排 √√#10001 「一本通 1.1 例 2」种树 √√#10002 「一本通 ...
- Hash学习小结
Hash 简要说明 \(OI\)中一般采用进制\(hash\).模数可以用\(unsigned \ long \ long\)自然溢出,也可以使用大质数.值得一提的是,\(unsigned\ long ...
- loj #6216. 雪花挂饰
(今天碰到的题怎么这么小清新 $n$ 个不相同的点,$q$ 组询问,每次给定 $l,r$,问在 $n$ 个点中,选出 $x$ 个点 $(x \in [l,r])$,用边连起来,能构成多少种不同的树 $ ...
随机推荐
- [CPP - STL] swap技巧
最近在看<Effective STL>,[条款17:使用“交换技巧”修整过剩容量]中提到容器的成函数void swap(container& from),即实现容器对象与from对 ...
- 如何强制ffmpeg编码时输出一个关键帧
http://blog.csdn.net/ashlingr/article/details/7829429 如何强制ffmpeg编码时输出一个关键帧 如何强制ffmpeg编码时输出一个关键帧 AV ...
- phpcms 内容模块PC标签调用
PHPcms 调用命令的基本格式: 开始:{pc:content action="模块操作名" catid="调用栏目ID" num="数据调用数量& ...
- hdu-5744 Keep On Movin(思维)
题目链接: Keep On Movin Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- having,groub by 结合聚合函数的用法解析
聚合函数有:sum , count, avg, max等等: where无法与聚合函数一起使用,所以在sql语句中加上having子句来筛选查询结果: 上面的sql语句是错的,正确如下: SELECT ...
- 【转】Cache Buffer Chain 第二篇
文章转自:http://m.bianceng.cn/database/Oracle/201407/42884.htm 测试环境:版本11gR2 SQL> select * from v$vers ...
- 转 vs2008使用技巧推荐
Visual Studio 2008自带的1000多个 Windows 系统使用的各种图标.光标和动画文件在Visual Studio 2008的安装目录下,\Microsoft Visual Stu ...
- Python的中文处理
一.使用中文字符 在python源码中如果使用了中文字符,运行时会有错误,解决的办法是在源码的开头部分加入字符编码的声明,下面是一个例子: #!/usr/bin/env python # -*- co ...
- nginx proxy https
server {listen 443;server_name mail.jb51.net; ssl on;ssl_certificate server.crt;ssl_certificate_key ...
- ORBslam总结
ORBSLAM的优缺点:优点:回环检测做得好,基本上只要见到过的场景都能找回来.采用一种更鲁棒的关键帧和三维点的选择机制——先用宽松的判断条件尽可能及时地加入新的关键帧和三维点, 以保证后续帧的鲁棒跟 ...