codeforces237C Primes on Interval

来源:互联网 发布:绝地求生n卡终极优化 编辑:程序博客网 时间:2024/05/16 07:07

Primes on Interval


还是挺简单的一道题,nlogn的算法很容易想 ,O(n)的就稍微麻烦了点

#include <cstdlib>#include <cctype>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>#include <vector>#include <string>#include <iostream>#include <sstream>#include <map>#include <set>#include <queue>#include <stack>#include <fstream>#include <numeric>#include <iomanip>#include <bitset>#include <list>#include <stdexcept>#include <functional>#include <utility>#include <ctime>using namespace std;#define PB push_back#define MP make_pair#define REP(i,n) for(int i=0;i<(n);++i)#define FOR(i,l,h) for(int i=(l);i<=(h);++i)#define DWN(i,h,l) for(int i=(h);i>=(l);--i)#define CLR(vis) memset(vis,0,sizeof(vis))#define MST(vis,pos) memset(vis,pos,sizeof(vis))#define MAX3(a,b,c) max(a,max(b,c))#define MAX4(a,b,c,d) max(max(a,b),max(c,d))#define MIN3(a,b,c) min(a,min(b,c))#define MIN4(a,b,c,d) min(min(a,b),min(c,d))#define PI acos(-1.0)#define INF 1000000000#define LINF 1000000000000000000LL#define eps 1e-8typedef long long ll;const int MAXN=1e6+5;bool notp[MAXN];int pr[MAXN],pn;void getprime(){    pn=0;    memset(notp,0,sizeof(notp));    notp[1]=1;    for(int i=2;i<MAXN;i++)    {        if(!notp[i])pr[pn++]=i;        for(int j=0;j<pn && pr[j]*i<MAXN;j++)        {            notp[pr[j]*i]=1;            if(i%pr[j]==0)break;        }    }}int a,b,k;int sum[MAXN];int check(int mid){    FOR(i,a,b-mid+1)    {       if(sum[i+mid-1]-sum[i-1]<k)            return 0;    }    return 1;}int solve(){    int l=1,r=b-a+1,mid,ans=-1;    while(l<=r)    {        mid=(l+r)>>1;        if(check(mid))        {            r=mid-1;            ans=mid;        }        else            l=mid+1;    }    return ans;}int main(){    getprime();    cin>>a>>b>>k;    CLR(sum);    FOR(i,a,b)      sum[i]=sum[i-1]+(notp[i]==0);    int ans=solve();    cout<<ans<<endl;    return 0;}


这是别人的O(n)算法

#include <stdio.h>#include <string.h>#include <iostream>#include <math.h>#include <string>#include <map>#include <set>#include <queue>#include <stack>#include <algorithm>#define inf 0x3f3f3f3f#define Inf 0x3FFFFFFFFFFFFFFFLL#define eps 1e-8#define DEBUG(a) cout<<#a" = "<<(a)<<endl;#define DEBUGARR(a,n) for(int i=0;i<(n);i++) {cout<<#a"["<<i<<"] = "<<(a)[i]<<endl;}#define pi acos(-1.0)using namespace std;#define maxn 1111111int pri[maxn], cnt;int mark[maxn];void sieve() {    int i, j;    cnt=1, pri[0] = 2;    for (i = 3; i < maxn; i += 2) {        if (!mark[i]) pri[cnt++] = i;        for (j = 1; j < cnt, pri[j] * i < maxn; ++j) {            mark[ i * pri[j] ] = 1;            if ( !(i % pri[j]) ) break;        }    }}int main(){    #ifdef StyleTang_Code    freopen("123.in","r",stdin);    freopen("123.out","w",stdout);    #endif    int i,j;    sieve();    for(i=0;i<maxn;i+=2)    mark[i]=1;    mark[1]=1;    mark[2]=0;    int a,b,k;    while(cin>>a>>b>>k)    {        int len=0;        int le=a;        int cnt=0;        if(mark[a]==0)        cnt=0;        for(i=a;i<=b;i++)        {            cnt=cnt+(mark[i]==0)-(mark[le]==0);            if(cnt>=k)            {                le++;                continue;            }            else            {                cnt=cnt+(mark[le]==0);                if(cnt>=k)                {                    len++;                    continue;                }                else                len++;                while(cnt<k&&i<=b)                {                    i++;                    cnt=cnt+(mark[i]==0);                    len++;                }                if(i>b)                len=-1;            }        }        if(cnt<k)        len=-1;        cout<<len<<endl;    }    return 0;}


0 0
原创粉丝点击