题意:给出一个n个数的序列

要求选出一个最长的子序列  可以进行重新排序    形成一个环  要求任意两个数之间 abs<=1 

 

强行贪心加模拟即可

555 div3 F. Maximum Balanced Circle*_子序列555 div3 F. Maximum Balanced Circle*_#define_02
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
const int N=2e5+5;
int vis[N],cnt[N],n,maxx,L,R;
vector<int>table;

int main()
{
    RI(n);
    rep(i,1,n)
    {
        int x;RI(x);
        if(!vis[x])vis[x]=1,table.pb(x);
        cnt[x]++;
    }
    sort(table.begin(),table.end());
    maxx=L=R=0;

    rep(i,0,table.size()-1)
    {
        int j=i+1,sum=cnt[table[i]];
        while(table[j]-table[j-1]==1&&cnt[table[j]]>1)sum+=cnt[table[j++]];
        int cur=j-1;
        if(table[j]-table[j-1]==1&&cnt[table[j]]==1)cur++,sum++;
        if(sum>maxx)
            maxx=sum,L=table[i],R=table[cur];
        i=j-1;
    }

    cout<<maxx<<endl;
    if(cnt[L]!=maxx)
    {
        while(cnt[L]--)
        printf("%d ",L);

        rep(i,L+1,R-1)
        while(cnt[i]>=2)
            printf("%d ",i),cnt[i]--;

        while(cnt[R]--)
        printf("%d ",R);

        repp(i,R-1,L+1)
        if(i!=L+1)printf("%d ",i);
        else printf("%d",i);
    }
    else while(cnt[L]--)
        if(cnt[L])printf("%d ",L);
        else printf("%d",L);

    return 0;
}
View Code