题解:P16323 【MX-J29-T2】区间选取
水题。每个数可以不动或者
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int c,t;
cin>>c>>t;
while(t--){
int n;
cin>>n;
vector<int>a(n);
for(int i=0;i<n;++i){
cin>>a[i];
}
sort(a.begin(),a.end());
vector<pair<int,int>>vals;
for(int i=0;i<n;){
int j=i;
while(j<n&&a[j]==a[i])++j;
vals.emplace_back(a[i],j-i);
i=j;
}
vector<int>u;
for(auto&p:vals){
int v=p.first;
if(v>1)u.push_back(v-1);
u.push_back(v);
u.push_back(v+1);
}
sort(u.begin(),u.end());
u.erase(unique(u.begin(),u.end()),u.end());
int ans=0;
int m_u=u.size();
int seg_start=0;
for(int i=1;i<=m_u;++i){
if(i==m_u||u[i]-u[i-1]>=3){
int start=u[seg_start];
int end=u[i-1];
int len=end-start+1;
vector<int>cnt(len,0);
for(auto&p:vals){
int v=p.first;
if(v>=start&&v<=end){
cnt[v-start]=p.second;
}
}
vector<int>dp0(len),dp1(len);
for(int i=len-1;i>=0;--i){
{
int nxt_state;
if(cnt[i]==0)nxt_state=0;
else nxt_state=1;
if(i==len-1)dp1[i]=i;
else dp1[i]=(nxt_state==0?dp0[i+1]:dp1[i+1]);
}
{
bool ok=true;
int nxt_state;
if(cnt[i]==0)ok=false;
else if(cnt[i]==1)nxt_state=0;
else nxt_state=1;
if(!ok)dp0[i]=i-1;
else if(i==len-1)dp0[i]=i;
else dp0[i]=(nxt_state==0?dp0[i+1]:dp1[i+1]);
}
}
for(int L_idx=0;L_idx<len;++L_idx){
int init_state=(L_idx>0&&cnt[L_idx-1]>0)?1:0;
int R_idx=(init_state==0?dp0[L_idx]:dp1[L_idx]);
if(R_idx>=L_idx){
int cur_len=R_idx-L_idx+1;
if(cur_len>ans)ans=cur_len;
}
}
seg_start=i;
}
}
cout<<ans<<'\n';
}
return 0;
}