UVA 11572 唯一的雪花

题意:给你从1到n的数组,要求求得其中的最长连续不重复子序列,经典的滑窗问题,方法是维护一个窗口,设置左框和右框,然后不断的进行维护和更新

方法一:

#include"iostream"
#include"set"
#include"cstring"
#include"cstdio"
#include"algorithm"
using namespace std;
const int maxn=1000000+10;
set<int>book;
int a[maxn];
int main()
{
int T;
cin>>T;
while(T--)
{
int n,t,sum=0,ans=0;
cin>>n;
book.clear();
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int r=0,l=0;
for(;r<n;)
{
while(!book.count(a[r])&&r<n)
{
book.insert(a[r]);
r++;
}
ans=max(ans,r-l);
book.erase(a[l]);
l++;
}
cout<<ans<<endl;
}
return 0;
}

方法二:

#include"iostream"
#include"set"
#include"cstring"
#include"cstdio"
#include"algorithm"
using namespace std;
const int maxn=1000000+10;
int pos[maxn];
int a[maxn];
int main()
{
int T;
cin>>T;
while(T--)
{
int n,t,sum=0,ans=0;
cin>>n;
memset(pos,-1,sizeof(pos));
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int r=0,l=0;
a[n]=a[n-1];
for(int i=0;i<=n;i++)
{
if(pos[a[i]]>=l)
{
ans=max(ans,i-l);
l=pos[a[i]]+1;
}
pos[a[i]]=i;
}
cout<<ans<<endl;
}
return 0;
}

刘汝佳紫书上还提到过滑动窗口的最小值问题,其中使用到了单调队列,贴个地址去学习学习:

http://m.blog.csdn.net/blog/lx417147512/24916441

#include <stdio.h>
#define MAX 1000001
int n,k;
int pre1,pre2,lst1,lst2,len_max,len_min; // 两个队列的头指针与尾指针,最大值的下标,最小值的下表
int num[MAX],Increase[MAX],Decrease[MAX],Max[MAX],Min[MAX]; // Num存数据,递增与递减队列,最大值,最小值的数组。
// 递减序列的压入操作
void in_min(int i)
{
while( pre1<=lst1 && num[ Decrease[lst1] ]<num[i] ) //一直到寻找到比当前待插入值更大的位置,这是维护一个递减序列
--lst1;
Decrease[++lst1]=i;

// 如果大于等于k个数,就需要向最大值数组赋值
if( i>=k )
{
if(Decrease[pre1]<=i-k)
pre1++;
Max[len_max++]=num[ Decrease[pre1] ]; //当前滑动窗口的最大值即为递减序列的队头
}
}
// 递增序列的压入操作
void in_max(int i)
{
while( pre2<=lst2 && num[ Increase[lst2] ]>num[i] ) //一直到寻找到比当前待插入值更小的位置,这是维护一个递增序列
--lst2;
Increase[++lst2]=i;

// 如果大于等于k个数,就需要向最小值数组赋值
if( i>=k )
{
if(Increase[pre2]<=i-k)
pre2++;
Min[len_min++]=num[ Increase[pre2] ]; //当前滑动窗口的最小值即为递增序列的队头
}
}
int main()
{
int i;
while( ~scanf("%d%d",&n,&k) )
{
// 初始化
pre1=pre2=len_max=len_min=0;
lst1=lst2=-1;

// 读入数据
for(i=1;i<=n;++i)
{
scanf("%d",&num[i]);
in_max(i);
in_min(i);
}

// 输出数据
for( i=0;i<len_min-1;++i )
printf("%d ",Min[i]);
printf("%d\n",Min[len_min-1]);
for( i=0;i<len_max-1;++i )
printf("%d ",Max[i]);
printf("%d\n",Max[len_max-1]);
}
return 0;
}

集训第四周(高效算法设计)K题 (滑窗问题)的更多相关文章

  1. 集训第四周(高效算法设计)A题 Ultra-QuickSort

    原题poj 2299:http://poj.org/problem?id=2299 题意,给你一个数组,去统计它们的逆序数,由于题目中说道数组最长可达五十万,那么O(n^2)的排序算法就不要再想了,归 ...

  2. 集训第四周(高效算法设计)P题 (构造题)

    Description   There are N<tex2html_verbatim_mark> marbles, which are labeled 1, 2,..., N<te ...

  3. 集训第四周(高效算法设计)O题 (构造题)

    A permutation on the integers from 1 to n is, simply put, a particular rearrangement of these intege ...

  4. 集训第四周(高效算法设计)N题 (二分查找优化题)

    原题:poj3061 题意:给你一个数s,再给出一个数组,要求你从中选出m个连续的数,m越小越好,且这m个数之和不小于s 这是一个二分查找优化题,那么区间是什么呢?当然是从1到数组长度了.比如数组长度 ...

  5. 集训第四周(高效算法设计)M题 (扫描法)

    原题:UVA11078 题意:给你一个数组,设a[],求一个m=a[i]-a[j],m越大越好,而且i必须小于j 怎么求?排序?要求i小于j呢.枚举?只能说超时无上限.所以遍历一遍数组,设第一个被减数 ...

  6. 集训第四周(高效算法设计)I题 (贪心)

    Description Shaass has n books. He wants to make a bookshelf for all his books. He wants the bookshe ...

  7. 集训第四周(高效算法设计)E题 (区间覆盖问题)

    UVA10382 :http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21419 只能说这道题和D题是一模一样的,不过要进行转化, ...

  8. 集训第四周(高效算法设计)D题 (区间覆盖问题)

    原题 UVA10020  :http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19688 经典的贪心问题,区间上贪心当然是右区间越 ...

  9. 集训第四周(高效算法设计)C题 (二分查找优化题)

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

随机推荐

  1. orcl 11g 创建表空间

    Oracle11g创建表空间语句   在plsql工具中执行以下语句,可建立Oracle表空间. /*分为四步 *//*第1步:创建临时表空间  */create temporary tablespa ...

  2. jmeter(十六)Jmeter之Bean shell使用(一)

    一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanS ...

  3. 基于CentOS6.5或Ubuntu14.04下Suricata里搭配安装 ELK (elasticsearch, logstash, kibana)(图文详解)

    前期博客 基于CentOS6.5下Suricata(一款高性能的网络IDS.IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐) 基于Ubuntu14.04下Suricata(一款高性能的网络ID ...

  4. WCF入门大致思路

    WCF服务: 1.IServer.cs(类似接口,WCF接口) 2.Server.svc(实现了WCF接口)右键浏览器运行可以看到WCF服务链接,类似(http://localhost:4609/Us ...

  5. "言官误国"

    "言官误国" 之前读<明朝那些事儿>的时候,了解到了一个全新的概念,确切的说与之前的印象完全不符合的概念:言官.之前我印象中的言官都是魏征那样的人,为国为民.冒死直谏等 ...

  6. java基础(六):RabbitMQ 入门

    建议先了解为什么项目要使用 MQ 消息队列,MQ 消息队列有什么优点,如果在业务逻辑上没有此种需求,建议不要使用中间件.中间件对系统的性能做优化的同时,同时增加了系统的复杂性也维护难易度:其次,需要了 ...

  7. GIT配置及用法

    ssh配置 TortoiseGit配置 用法: 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository:仓 ...

  8. Objective - c Chapter 1 -2 Hello world

    Objective - c   Chapter 1  Hello world 1.1 1.2.On the Welcome screen, click "Create a new Xcode ...

  9. iOS-UI控件之UIButton

    ---恢复内容开始--- UIButton 既可以显示图片,又可以显示文字,还能随时调整内部位置 系统自带尺寸 storyboard内部调整UIButton属性 状态 监听按钮点击事件 凡是继承自UI ...

  10. InChatter系统之服务器开发(一)

    服务器端是整个消息系统的中枢,类似与人类的大脑.没有他,根本无法实现客户端之间的交流,为什么呢?这也涉及到我们的系统涉及,在服务器端,每个客户端的标识数据都会在服务器端进行保存,在这种情况下,当某一个 ...