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); }
                    
                
                
            
        
浙公网安备 33010602011771号