Food display arrangement

https://ac.nowcoder.com/acm/contest/19506/D

用总数减去不相交的区间个数和的最大值(区间是一个数出现 的left和right)

再对right从小到大排序

对a[i]离散化

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
int a[maxn],b[maxn],v[maxn],l[maxn],r[maxn],vis[maxn];
struct Node
{
    int l,r;
}no[maxn];
int cmp(Node q,Node w)
{
    if(q.r==w.r)
        return q.l<w.l;
    else
        return q.r<w.r;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      {
           scanf("%d",&a[i]);
           b[i]=a[i];
      }
      sort(b+1,b+n+1);
      int len=unique(b+1,b+n+1)-b-1;
      for(int i=1;i<=n;i++)
        a[i]=lower_bound(b+1,b+len+1,a[i])-b;

       for(int i=1;i<=n;i++)
       {
           if(!v[a[i]])
           {
               v[a[i]]=1;
               l[a[i]]=i;
           }
           r[a[i]]=i;
        }
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            if(!vis[a[i]])
            {
                vis[a[i]]=1;
                no[cnt].l=l[a[i]];
                no[cnt].r=r[a[i]];
                cnt++;
            }
        }
        sort(no,no+cnt,cmp);
        int res=0;
        int st=-1;
        for(int i=0;i<cnt;i++)
        {
            if(no[i].l>st)
            {
                st=no[i].r;
                res++;
            }
        }
        //printf("len=%d\n",len);
          //printf("res=%d\n",res);
        printf("%d\n",len-res);
}

用map把值和他的区间对应起来,最后只用用结构体Node的数组来保存区间就可以了

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
int a[maxn],b[maxn],v[maxn],l[maxn],r[maxn],vis[maxn];
struct Node
{
    int l,r;
}no[maxn];
int cmp(Node q,Node w)
{
    if(q.r==w.r)
        return q.l<w.l;
    else
        return q.r<w.r;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      scanf("%d",&a[i]);
      map<int ,Node>  ma;
      for(int i=1;i<=n;i++)
            ma[a[i]].r=i;
      for(int i=n;i>=1;i--)
            ma[a[i]].l=i;
      int cnt=0;
       map<int ,Node> :: iterator i;
      for(i=ma.begin();i!=ma.end();i++)
      {
          no[++cnt]=(*i).second;
      }
      sort(no+1,no+1+cnt,cmp);
      int st=no[1].r;
      int res=1;
      for(int i=2;i<=cnt;i++)
      {
          if(no[i].l>st)
          {
              res++;
              st=no[i].r;
          }
      }
      printf("%d\n",cnt-res);
}

 

posted @ 2021-08-17 20:22  废柴废柴少女  阅读(33)  评论(0)    收藏  举报