zoukankan      html  css  js  c++  java
  • #C++初学记录(set进阶#acm cf 190802 B. 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的值
    
  • 相关阅读:
    php数据库常用函数
    什么是RESTful API
    RESTful API 设计指南
    json和jsonp的使用区别
    Memcached, Redis, MongoDB区别
    入门系列之在Nginx配置Gzip
    100行代码搞定抖音短视频App,终于可以和美女合唱了。
    游戏开发者注意!这个音频SDK可以完美兼容所有主流游戏引擎
    快速上手:在CVM上安装Apache
    聚焦小游戏技术生态,腾讯游戏云GAME-TECH落地厦门
  • 原文地址:https://www.cnblogs.com/xiaofengqaq/p/11314037.html
Copyright © 2011-2022 走看看