set up cf 190802 Subsegments

B. Subsegments#set进阶

Programmer Sasha has recently begun to study data structures. His coach Stas told him to solve the problem of finding a minimum on the segment of the array in , which Sasha coped with. For Sasha not to think that he had learned all, Stas gave him a new task. For each segment of the fixed length Sasha must find the maximum element of those that occur on the given segment exactly once. Help Sasha solve this problem.

Input
The first line contains two positive integers n and k (1 ≤ n ≤ 105, 1 ≤ k ≤ n) — the number of array elements and the length of the segment.

Then follow n lines: the i-th one contains a single number ai ( - 109 ≤ ai ≤ 109).

Output
Print n–k + 1 numbers, one per line: on the i-th line print of the maximum number of those numbers from the subarray ai ai + 1 … ai + k - 1 that occur in this subarray exactly 1 time. If there are no such numbers in this subarray, print "Nothing".

Examples
input

5 3
1
2
2
3
3
output
1
3
2
input
6 4
3
3
3
4
4
2
output
4
Nothing
3
正确代码

#include <iostream>
#include <bits/stdc++.h>
#define MAXN 100010
using  namespace std;

multiset<int> A;
set<int>B;
int a[MAXN];
int main()
{

    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=k;i++)
    {
        int t=a[i];
        if(!A.count(t))
            B.insert(t);
        else
            B.erase(t);
        A.insert(t);
    }
    if(!B.size()) cout<<"Nothing"<<endl;
    else cout<<*--B.end()<<endl;

    for(int i=k+1;i<=n;i++)
    {
        auto pos=A.find(a[i-k]);
        A.erase(pos);
        if(!A.count(a[i-k])&&B.count(a[i-k])) B.erase(a[i-k]);
        else if(A.count(a[i-k])==1&&!B.count(a[i-k])) B.insert(a[i-k]);

        if(!A.count(a[i]))
            B.insert(a[i]);
        else
            B.erase(a[i]);
        A.insert(a[i]);
        if(!B.size()) cout<<"Nothing"<<endl;
        else cout<<*--B.end()<<endl;

    }
    return 0;
}

题意理解
求区间内只出现过一次的元素里的最大元素 ,使用一个multiset 可以存相同的变量,使用set存单个变量, 用multiset做标记进行判断是否为单个元素,然后用set存答案, 每次移动一次,存入multiset中判断是否重复,不重复则存入set中。
set和multiset相关
set的一些基本常用用法

begin()        ,返回set容器的第一个元素

end()      ,返回set容器的最后一个元素

clear()          ,删除set容器中的所有的元素

empty()    ,判断set容器是否为空

max_size()   ,返回set容器可能包含的元素最大个数

size()      ,返回当前set容器中的元素个数

rbegin     ,返回的值和end()相同

rend()     ,返回的值和rbegin()相同

此外,还有一些操作也是set有必要学习的但不常见:

1) count() 用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了,而multiset可以返回大于1的数

2)equal_range() ,返回一对定位器,分别表示第一个大于或等于给定关键值的元素和 第一个大于给定关键值的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于end()的值。

3)erase(iterator)  ,删除定位器iterator指向的值

4)erase(first,second),删除定位器first和second之间的值

5)erase(key_value),删除键值key_value的值
全部评论

相关推荐

05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
点赞 评论 收藏
分享
当初高考报计算机真是造大孽了啊!卷的飞起!哪都是计算机的人,考研,考公,找工作全他奶的计算机的人,太难了。国企也是。关键一届比一届卷,造大孽了!
_Lyrics_:因为计算机,没有体验到快乐的大学研究生时光,好不容易修完课程就要出去实习,看着别人专业可以一起搓麻将,游山玩水,而我却要自己一个人住在北上不到十平米的出租屋,每天两点一线
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务