log n 模版

版权声明:转载者乖乖♂站好 https://blog.csdn.net/Eric1561759334/article/details/82733426

树状数组

int lowbit(int x)
{
    return x&-x;
}
void insert(int x,int d)
{
    sum+=d;
    for(; x<=mx; x+=lowbit(x)) s[x]+=d;
}
int query(int x)
{
    int p=0;
    for(; x; x-=lowbit(x)) p+=s[x];
    return sum-p;
}

线段树

void ins(int st,int ed,int l,int r,int c,int u)
{
    if(l>r) return;
    if(c==a[u]) return;
    if(st==l&&ed==r) a[u]=c;else
    {
        if(a[u]!=-1) a[u*2+1]=a[u],a[u*2]=a[u],a[u]=-1;
        int mid=(st+ed)>>1;
        if(r<=mid) ins(st,mid,l,r,c,u*2);else
        if(l>mid) ins(mid+1,ed,l,r,c,u*2+1);else
        {
            ins(st,mid,l,mid,c,u*2);
            ins(mid+1,ed,mid+1,r,c,u*2+1);
        }
    }
}
int query(int l,int r,int u,int &lc,int &rc)
{
    int lt=0,rt=0;
    if(a[u]!=-1)
    {
        rc=lc=a[u];
        return 1;
    }
    if(l==r) return 1;
    int mid=(l+r)>>1,s=query(l,mid,u*2,lc,lt)+query(mid+1,r,u*2+1,rt,rc);
    return s-(lt==rt?1:0);
}

GCD

void add(int u,int v)
{
    e[++cnt].to=v; e[cnt].next=list[u]; list[u]=cnt;
}
void dfs(int r,int fa)
{
    d[r]=d[fa]+1;
    p[r][0]=fa;
    for(int i=1; (1<<i)<=d[r]; i++) p[r][i]=p[p[r][i-1]][i-1];
    for(int i=list[r]; i!=-1; i=e[i].next)
    {
        int u=e[i].to;
        if(u!=fa) dfs(u,r);
    }
}
int gcd(int x,int y)
{
    if(d[x]>d[y]) swap(x,y);
    for(int i=ln; i>=0; i--)
    {
        if(d[x]<=d[y]-(1<<i)) y=p[y][i];
    }
    if(x==y) return x;
    for(int i=ln; i>=0; i--)
    {
        if(p[x][i]==p[y][i]) continue;else
        {
            x=p[x][i]; y=p[y][i];
        }
    }
    return p[x][0];
}

猜你喜欢

转载自blog.csdn.net/Eric1561759334/article/details/82733426