zoukankan      html  css  js  c++  java
  • 「LOJ#10042」「一本通 2.1 练习 8」收集雪花 (map

     题目描述

    不同的雪花往往有不同的形状。在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们。一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状。在收集的过程中,同学们不希望有重复的雪花。你可以从任意 a 时刻开始,在 b 时刻停止。a b 时刻中间的雪花也都将被收集。他们希望收集的雪花最多。

    输入格式

    第一行一个正整数 n

    2n 个非负整数表示 n个时刻雪花的形状。

    输出格式

    最多能收集雪花的数量。

    样例

    输入样例

    5
    1 2 3 2 1

    输出样例

    3

    数据范围与提示

    对于97 分的数据,1≤n≤106,0≤xi≤108

    应用户要求,加入 3 分的数据,1≤n≤106,0≤xi≤109.

     题解

    首先很糙的思路:维护一左一右两个指针,每次把右指针右移一位,同时把左指针左移到区间内无重复值为止。移的过程中维护长度最大值,记为答案。

    然后就要判断某个值是否存在嘛,还要支持把存在的东西抹掉。

    感觉这种判定是否存在的东西,map比hash好用INF倍好嘛!!!(超大声

    Hash又要考虑冲突,又要挂链......(好像也不是很难写?

    map前置技能:

    定义:map<type1,type2>mp;

         eg:map<int,bool>mp;

    修改(插入):mp[x]=y(x为type1,y为type2)

    查询是否存在:mp.find(x)!=mp.end()为存在。

    删除:mp.erase(pos),其中pos是迭代器。

         eg:mp.erase(mp.find(x))。

    还害怕自己的map超时来着2333

    /*
    编号     题目     状态     分数     总时间     内存     代码 / 答案文件     提交者     提交时间
    #227989     #10042. 「一本通 2.1 练习 8」收集雪花    Accepted     100     5457 ms     6780 KiB     C++ / 400 B     qwerta     2018-10-14 10:07:37
    */
    
    #include<bits/stdc++.h>
    using namespace std;
    int x,i,n,l=1,a[1000003],b=0,r;
    map<int,int>mp;
    int main()
    {
        cin>>n;
        for(int r=1;r<=n;++r)
        {
            cin>>a[r];
            if(mp.find(a[r])!=mp.end())//如果a[r]存在
            {
                while(a[l]!=a[r])
                mp.erase(mp.find(a[l++]));//一直pop到和a[r]相同的点
                l++;
            }
            else mp[a[r]]=1;//否则直接打标记
            b=max(b,r-l+1);
        }
        cout<<b;
    }
  • 相关阅读:
    C#下水晶报表打印自定义纸张
    设计模式应用之一:控件清空
    自定义StyleCop规则
    1.redis安装 单机
    dubbo个人总结
    spring+redis 集群下的操作
    mybatis调用存储过程 无参、带有输入输出参数,输出游标类型的 存储
    spring framework核心框架体系结构
    oracle‘s package,function,proceture编译时无响应(解决)
    Oracle 在线重定义表分区
  • 原文地址:https://www.cnblogs.com/qwerta/p/9813430.html
Copyright © 2011-2022 走看看