【uva 11572】Unique Snowflakes(算法效率--滑动窗口,3种实现方法)
题意:求长度为N的序列中,最长的一个无重复元素的连续子序列。
解法:[L,R]每次R++或L++延伸就可以得到答案。
实现:(1)next[],last[]——O(n);
1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 using namespace std;
7 #define N (int)1e6+10
8
9 struct node{int x,d,t;}a[N],b[N];
10 int hou[N],last[N];
11 int n,m,i,j,k;
12
13 bool cmp(node x,node y) {return x.x<y.x;}
14 int mmax(int x,int y) {return x>y?x:y;}
15 void input()
16 {
17 scanf("%d",&n);
18 for (i=1;i<=n;i++)
19 {
20 scanf("%d",&a[i].x);
21 a[i].t=i;
22 }
23 }
24 void init()
25 {
26 memcpy(b,a,sizeof(a));
27 sort(b+1,b+1+n,cmp);
28 m=1,a[b[1].t].d=m;
29 for (i=2;i<=n;i++)
30 {
31 if (b[i].x!=b[m].x) b[++m]=b[i];
32 a[b[i].t].d=m;
33 }
34 memset(hou,-1,sizeof(hou));
35 for (int i=1;i<=n;i++)
36 {
37 last[i]=hou[a[i].d];
38 hou[a[i].d]=i;
39 }
40 }
41 int solve()
42 {
43 int l=1,r=1,ans=0;
44 while (r<=n)
45 {
46 while (r<=n&&last[r]<l) r++;
47 ans=mmax(ans,r-l);
48 l++;
49 }
50 return ans;
51 }
52 int main()
53 {
54 int T;
55 scanf("%d",&T);
56 while (T--)
57 {
58 input();
59 init();
60 printf("%d\n",solve());
61 }
62 return 0;
63 }
64 1
Code1
(2)set.insert(),count(),erase()——O(nlogn);
1 #include<cstdio>
2 #include<set>
3 #include<algorithm>
4 using namespace std;
5 const int maxn = 1000000 + 5;
6 int A[maxn];
7 int main( ) {
8 int T, n;
9 scanf("%d", &T);
10 while(T--) {
11 scanf("%d", &n);
12 for(int i = 0; i < n; i++) scanf("%d", &A[i]);
13 set<int> s;
14 int L = 0, R = 0, ans = 0;
15 while(R < n) {
16 while(R < n && !s.count(A[R])) s.insert(A[R++]);
17 ans = max(ans, R - L);
18 s.erase(A[L++]);}
19 printf("%d\n", ans);
20 }
21 return 0;
22 }
Code2(from 紫书)
(3)map.clear(),count()——O(nlogn)。
1 #include<cstdio>
2 #include<map>
3 using namespace std;
4 const int maxn = 1000000 + 5;
5 int A[maxn], last[maxn];
6 map<int, int> cur;
7 int main( ) {
8 int T, n;
9 scanf("%d", &T);
10 while(T——) {
11 scanf("%d", &n);
12 cur.clear( );
13 for(int i = 0; i < n; i++) {
14 scanf("%d", &A[i]);
15 if(!cur.count(A[i])) last[i] = -1;
16 else last[i] = cur[A[i]];
17 cur[A[i]] = i;
18 }int L = 0, R = 0, ans = 0;
19 while(R < n) {
20 while(R < n && last[R] < L) R++;
21 ans = max(ans, R - L);
22 L++;
23 } p
24 rintf("%d\n", ans);
25 } r
26 eturn 0;
27 }
Code3(from 紫书)
【uva 11572】Unique Snowflakes(算法效率--滑动窗口,3种实现方法)的更多相关文章
- (白书训练计划)UVa 11572 Unique Snowflakes(窗体滑动法)
题目地址:UVa 11572 这样的方法曾经接触过,定义两个指针,不断从左向右滑动,推断指针内的是否符合要求. 这个题为了能高速推断是否有这个数,能够用STL中的set. 代码例如以下: #inclu ...
- UVa 11572 Unique snowflakes【滑动窗口】
题意:给出 n个数,找到尽量长的一个序列,使得该序列中没有重复的元素 看的紫书,滑动窗口来做的 当右端碰到有相同的数的时候,左端向前滑动一个数 模拟一个样例好理解些 #include<iostr ...
- 【uva 12174】Shuffle(算法效率--滑动窗口)
题意:假设一种音乐播放器有一个乱序的功能,设定每播放S首歌为一个周期,随机播放编号为1~S的歌曲.现在给一个长度为N的部分播放记录,请统计下次随机排序所发生的时间的可能性种数.(1≤S,N≤10000 ...
- uva 11572 unique snowflakes——yhx
Emily the entrepreneur has a cool business idea: packaging and selling snowakes. She has devised ama ...
- UVA - 11572 Unique Snowflakes(唯一的雪花)(滑动窗口)
题意:输入一个长度为n(n <= 10^6)的序列A,找到一个尽量长的连续子序列AL~AR,使得该序列中没有相同的元素. 分析: 法一:从r=0开始不断增加r,当a[r+1]在子序列a[l~r] ...
- UVA - 11572 Unique Snowflakes 滑动扫描
题目:点击打开题目链接 思路:从左往右扫描,定义扫描左端点L,右端点R,保证每次往几何中添加的都是符合要求的连续的数列中的元素,L和R从0扫到n,复杂度为O(n),使用set维护子数列,set查找删除 ...
- UVA - 11572 Unique Snowflakes
/* STLsort离散化==T 手工sort离散化==T map在线==T map离线处理c==A 240ms */ #include<cstdio> #include<map&g ...
- uva 11572 - Unique Snowflakes(和书略有不同)
本书是关于使用刘汝佳set, 通过收集找到.count()和删除.erase().这种方法比我好.用较短的时间. 我想map这个任务可以完成.但是,这是不容易删除,必须先找到find()标.然后删除索 ...
- UVa 11572 唯一的雪花(滑动窗口)
https://vjudge.net/problem/UVA-11572 题意:输入一个长度为n的序列A,找到一个尽量长的连续子序列,使得该序列中没有相同的元素. 思路:很简单的题,也没啥好解释的了. ...
随机推荐
- python使用msgpack(umsgpack)
前言 如果有业务需要将一个数据塞进队列由另一端接收,我们就需要考虑到数据的大小,因为这跟队列的效率和稳定性正相关,如果你希望能对这部分数据进行一定的压缩,并且提高解压缩的效率时,希望你能想到 msgp ...
- for update语句锁机制问题
数据库小知识学习系列 问题: MySQL InnoDB中,select where xxx=123 for update:该xxx没有索引,是使用表锁还是全部数据加行锁? 答: InnoDB引擎(默认 ...
- 【Linux】如何查找命令及历史记录history
如何查找命令及历史记录 文章目录 如何查找命令及历史记录 1.如何找到一个命令 2.命令的历史记录 3.一些实用的快捷键 4.小结 5.参考资料 如何找到一个命令.命令的历史记录.一些实用的快捷键.总 ...
- 【MySQL】centos6中/etc/init.d/下没有mysqld启动文件,怎么办
如果/etc/init.d/下面没有mysqld的话,service mysqld start也是不好使的,同样,chkconfig mysqld on也是不能用 解决办法: 将mysql的mysql ...
- P1967 货车运输(倍增LCA,生成树)
题目链接: https://www.luogu.org/problemnew/show/P1967 题目描述 A国有n座城市,编号从 1到n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制, ...
- 两行代码修复了解析MySQL8.x binlog错位的问题!!
写在前面 MySQL是互联网行业使用的最多的关系型数据库之一,而且MySQL又是开源的,对于MySQL的深入研究,能够加深我们对于数据库原理的理解.自从开源了mykit-data之后,不少小伙伴试用后 ...
- CTFshow-萌新赛逆向_flag白给
查看题目信息 下载后得到一个flag.exe文件,进行测试 使用PEiD查壳 发现一个upx的壳 使用命令进行解壳 upx -d 拿到一个无壳的程序 放进OD打开,查找关键词 发现信息 成功拿到序列号 ...
- CTFhub刷题记录
一 [WesternCTF2018]shrine 没什么好说的,SSTI模版注入类问题,过滤了()但是我们不慌.开始注入,{{29*3}}测试通过. 发现是jinjia2的模版注入.关键点在于没有() ...
- Spring Validation 验证
基本配置 1.pom引入maven依赖 <dependency> <groupId>javax.validation</groupId> <artifactI ...
- MySQL中UPDATE语句里SET后使用AND的执行过程和结果分析
使用SQL中的UPDATE关键字更新多个字段值时,SET后面的更新字段应该使用逗号而不能用AND.虽然用AND不会报错,但会使更新结果错误,下面我将通过场景来分析当我们使用AND时SQL的执行过程和为 ...