uva 11572 唯一的雪花 Unique Snowflakes



輸入一個長度為n(n<=1e6)的序列A,找到一個盡量長的連續子序列AL~AR,使得該序列中沒有相同元素。輸出最大長度。


核心是:

對數據處理類似與一個隊列的結構,隊頭front,隊尾rear,兩個都可以不斷增加,比如rear增加1,那么為了保證同一個元素不在隊列里出現兩次,可能會出隊一些元素。


或者可以這么解釋,對於每一個值x,記錄前一個值x出現的位置last[x],所以考慮x進入序列時,last[x]及以前的元素不得考慮。


具體實現:

數據結構的選擇有很多種,不管是用map還是set還是自己定義的結構體都是可以的。


我自己寫的稍微麻煩點,離散化+隊列處理。

離散化:先排序,然后用存儲每個數值的映射值,o(nlogn)。其實這個作法相當於用map作為存儲結構。


用set是很自然的想法,因為掃描的順序是從左往右,所有set只用記錄每個元素是否出現即可。



不管是枚舉rear所在位置[0,n)還是front所在位置[0,n)都是可以的




/**==========================================
 *   This is a solution for ACM/ICPC problem
 *
 *   @source£º
 *   @type:
 *   @author: wust_ysk
 *   @blog:  http://blog.csdn.net/yskyskyer123
 *   @email: 2530094312@qq.com
 *===========================================*/
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define REP(i,n)  for(int i=0 ;i<(n) ;i++)
using namespace std;
typedef long long ll;
const int INF =0x3f3f3f3f;
const int maxn= 1000000   ;
struct Node
{
    int ind,x,y;
    bool operator<(const Node b)const
    {
        return ind<b.ind;
    }

}a[maxn+4];

bool cmp(Node c,Node b)
{
    return c.x<b.x;
}
int n;

struct MyQueue
{
    int front,rear;
    bool vis[maxn+4];
    void clear()
    {
        front=rear=0;
        memset(vis,0,n*sizeof vis[0]);
    }
    int size()
    {
        return rear-front;
    }
    void push(int y)
    {
        if(!vis[y])
        {
            rear++;
            vis[y]=1;
            return;
        }
        while(a[front].y!=y )
        {
            vis[a[front].y]=0;
            front++;
        }
        front++;
        rear++;

    }

}Q;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        REP(i,n)
        {
            scanf("%d",&a[i].x);
            a[i].ind=i;
        }
        sort(a,a+n,cmp);
        REP(i,n)
        {
            a[i].y=i;
            int t=i;
            while(i+1<n&&a[i+1].x==a[i].x)
            {
                a[++i].y=t;
            }
        }
        sort(a,a+n);
        Q.clear();
        int ans=0;
        REP(i,n)
        {
            int y=a[i].y;
            Q.push(y);
            ans=max(ans,Q.size());
        }
        printf("%d\n",ans);
    }

   return 0;
}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com