20307 百万富翁的第二次实验 题解

题目描述

马克吐温有一本非常著名的小说《百万英镑》,这本小说中主角最后归还了百万英镑给两位富翁。但结果就是两位富翁依然有无穷的问题需要进行社会实验,于是,他们打算进行第二次社会实验。那就是不同财富值的人在一场舞会上会发生什么事情。为了满足自己的好奇,百万富翁们邀请了全伦敦所有人来自己的舞会。舞会开始后他们就后悔了,因为来的人太多了,而且很多人的财富都相同,统计起来太费事了。所以百万富翁们找到你,希望你根据来舞会的时间,找出在一段时间内,来舞会的所有人财富值都互不相同的人数。

输入格式

第一行输入一个n表示有n个人参与舞会。

按照时间顺序输入n个人的财富值。

输出格式

输出在一段时间内参加舞会的所有人财富值都互不相同的人数的最大值。

样例

Input 1

7
2 3 4 5 5 6 7

Output 1

4

数据范围

每个人的财富值不超过 10 ^{11}

0\le n \le 10^6


题面分析

捕捉题目关键词:

在一段时间内,来舞会的所有人财富值都互不相同的人数。

翻译:

最长连续不重复子序列

看到这个关键词,可能很多同学都认为这是一道DP(其实我也这么想过
但,其实这题是双指针(怎么好像感觉有点贪心但好像又没有)

l 为当前区间的左边界, r 为当前区间的右边界,用一个 map 来储存当前区间有那些值
r 增加

如果 a_r 没被 map 标记,标记 a_r 并继续
如果已经被标记, l 增加到和 a_r 相同的值的后一个下标,去除前面的 map 标记

记录最大的区间

参考核心代码:

int l=1,r=1;
int ans=1;
while(r<=n){//右边界不超限
        mp[a[r]]++;
        if(mp[a[r]]>1){
            while(a[l]!=a[r]) mp[a[l]] - -,l++;//将l增加到和a[r]相同的下标
            mp[a[l]] - -;
            l++;//增加到下一个
        }
		ans=max(ans,r-l+1);
        r++;
}

点个赞吧QWQ

6 个赞

你这没侵权吗

1 个赞


侵权神魔?

1 个赞

头像与名字

1 个赞

目测肖像权

1 个赞

emm
只要他不看XYD
就不侵权

1 个赞

头像侵个damn的肖像

3 个赞

chen_zhe:开庭时记得带上你的XYD

1 个赞

我们任何一人都可以把你告了

2 个赞

告吧QAQ
我们班的腾讯会议还有kkksc03呢

1 个赞

然后把他揪出来是吧

2 个赞

我们班还有AI小助手,腾讯会议小助手呢。

1 个赞

而且有的时候会出现两个人互相对骂,同一个头像和名字。

1 个赞

我们班群魔乱舞的
基本有以下几个名字(非真):
我们意念合一(虫大+虫二)
我_们_意_念_合_一(鸡大+鸡二)
kkksc03
蹦蹦
光头强
chen_zhe(我)

1 个赞

还有114514(头像为田所浩二)

2 个赞

@陈杰阳

1 个赞

666

2 个赞