题意:
百度。
思路:
一个连续数组111222233344444555666的每一个起伏转折即需要一张万能牌。
然后二分一下得最长区间。
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> using namespace std; typedef long long LL; const LL mod=1e9+7; const int N=1e5+10; int b[N]; bool vis[N]; int num; int Search(int left,int right) { int L=left; while(left<right) { int mid=left+(right-left+1)/2; if(b[mid]-b[L]<=num) left=mid; else right=mid-1; } return left; } int main() { int T; scanf("%d",&T); while(T--) { int n,m,x; scanf("%d%d",&n,&m); memset(vis,0,sizeof(vis)); num=0; for(int i=0;i<n;i++) { scanf("%d",&x); if(x==0) num++; else vis[x]=1; } b[0]=0; for(int i=1;i<=m;i++) { if(vis[i]) b[i]=b[i-1]; else b[i]=b[i-1]+1; } int res=0; for(int i=0;i<=m;i++) res=max(Search(i,m)-i,res); printf("%d ",res); } return 0; }