OIIIIIIII

「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;
}

 

posted @ 2018-10-18 21:47  qwertaya  阅读(1014)  评论(1编辑  收藏  举报
MDZX
Changsha
Fulan