BZOJ 3048: [Usaco2013 Jan]Cow Lineup 双指针

看到这道题的第一个想法是二分+主席树(好暴力啊)  

实际上不用这么麻烦,用一个双指针+桶扫一遍就行了 ~ 

code: 

#include <bits/stdc++.h>   
#define N 100006 
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;   
int n,k,ans=1,kind,a[N],bu[N],A[N];  
int main() 
{ 
    // setIO("input"); 
    int i,j;  
    scanf("%d%d",&n,&k); 
    for(i=1;i<=n;++i)    scanf("%d",&a[i]),A[i]=a[i]; 
    sort(A+1,A+1+n); 
    for(i=1;i<=n;++i)    a[i]=lower_bound(A+1,A+1+n,a[i])-A;       
    bu[a[1]]=kind=1;  
    int l=1; 
    for(int r=2;r<=n;++r) 
    {   
        if(!bu[a[r]]) ++kind; 
        ++bu[a[r]];    
        while(l<=r&&kind>k+1) 
        {
            --bu[a[l]];   
            if(bu[a[l]]==0)  --kind;    
            ++l;   
        }   
        ans=max(ans,bu[a[r]]);       
    }    
    printf("%d\n",ans); 
    return 0; 
}

  

猜你喜欢

转载自www.cnblogs.com/guangheli/p/12056117.html