线段树模板

Posted jcrl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树模板相关的知识,希望对你有一定的参考价值。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N 100001
using namespace std;
int num=0,ans=0,minn,anx,yes[N],no[N];
void xs(){
    memset(yes,0,sizeof(yes));
    memset(no,0,sizeof(no));
    no[0]=no[1]=1;
    for (int i=2; i<N; i++){
        if (!no[i]) yes[num++]=i;
        for (int j=0; j<num && i*yes[j]<N; j++){
            no[i*yes[j]]=1;
            if (!(i%yes[j])) break;
        }
    }
}
void work(int start,int s,int x,int L,int R){
    if (x>=minn){
        if ((s>ans) || (s==ans && x<anx))
            ans=s,anx=x;
    }
    if ((L==R) && (L>x))
        work(start,s<<1,x*L,1,1);
    for (int i=start; i<num; i++){
        if (yes[i]>R) return;
        int j=yes[i],ll=L-1,l=L,r=R,y=x,ss=s,m=1;
        while (1){
            m++; ss+=s; ll/=j; l/=j; r/=j;
            if (ll==r) break; y*=j;
            work(i+1,ss,y,l,r);
        }
        m=1<<m;
        if (s<(ans/m)) return;
    }
}
int main(){
    int l,r;
    scanf("%d%d",&l,&r);
    xs();
    if (l==1 && r==1) ans=1,anx=1;
    else {
        minn=l,ans=2,anx=l;
        work(0,1,1,l,r);
    }
    printf("Between %d and %d, %d has a maximum of %d divisors.
",l,r,anx,ans);
    return 0;
}

 

以上是关于线段树模板的主要内容,如果未能解决你的问题,请参考以下文章

线段树模板整理

线段树模板总结

线段树模板

模板线段树-单点修改,区间查询

P3834 模板可持久化线段树 1(主席树)

模板 线段树(部分功能)