码迷,mamicode.com
首页 > 其他好文 > 详细

FZU 2216 The Longest Straight 二分

时间:2015-12-28 18:22:41      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

0可以表示任何1到m的数,求一个最长的连续上升序列长度

因为m的范围在10w,所以以每个节点为起点 进行二分,复杂度mlogm

思路:b[i]表示到 1 到 i 有几个数没有出现,二分的时候注意加等号

技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<queue>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int maxn=100000+5;
bool vis[maxn];
int b[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m,sum=0;
        scanf("%d%d",&n,&m);
        memset(vis,0,sizeof(vis));
        int x;
        for(int i=1; i<=n; ++i)
        {
            scanf("%d",&x);
            if(!x)sum++;
            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 ans=1;
        for(int i=1; i<m; ++i)
        {
            int l=i,r=m,mid;
            while(l<=r)
            {
                mid=(l+r)>>1;
                if(b[mid]-b[i-1]>sum)r=mid-1;
                else l=mid+1;
            }
            mid=(l+r)>>1;
            ans=max(ans,mid-i+1);
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

FZU 2216 The Longest Straight 二分

标签:

原文地址:http://www.cnblogs.com/shuguangzw/p/5083380.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!