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的值
    
  • 相关阅读:
    vue路由传参页面刷新参数丢失问题解决方案
    理解MVC,MVP 和 MVVM
    HTTPS用的是对称加密还是非对称加密?
    元素显示隐藏的9种思路
    CSS中层叠上下文
    DOM盒模型和位置 client offset scroll 和滚动的关系
    css重点知识和bug解决方法
    你可能不知道的CSS
    如何在 React 中优雅的写 CSS?
    html5不常用标签应用场景
  • 原文地址:https://www.cnblogs.com/xiaofengqaq/p/11314037.html
Copyright © 2011-2022 走看看