首页 > 学院 > 开发设计 > 正文

FZU2216【二分】

2019-11-06 08:58:15
字体:
来源:转载
供稿:网友

题意:

百度。

思路:

一个连续数组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/n",res);    }    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表