C/C++教程

Data Structure

本文主要是介绍Data Structure,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

单调栈:

#include<bits/stdc++.h>
using namespace std;

懒得写,放个头文件看着整齐。

 

ST表:

#include<bits/stdc++.h>
using namespace std;

int n,m;
int a[1000005][22];
int query(int l,int r)
{
    int k=log2(r-l+1);
    return max(a[l][k],a[r-(1<<k)+1][k]);
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i][0]);
    }
    for(int j=1;j<=21;j++)
    {
        for(int i=1;i+(1<<j)-1<=n;i++)
        {
            a[i][j]=max(a[i][j-1],a[i+(1<<(j-1))][j-1]);
        }
    }
    for(int i=0;i<m;i++)
    {
        int l,r;
        scanf("%d %d",&l,&r);
        printf("%d\n",query(l,r));
    }
    return 0;
}

 

树状数组:

int n,a[10000],c[10000];//a is the original array and c is the tree array
int lowbit(int x)
{
    return x&(-x);
}
void updata(int i,int k)//add k to pos[i] of  original array 
{
    while(i<=n)
    {
        c[i]+=k;
        i+=lowbit(i);
    }
}
int getsum(int i)//get the sum of from a[1] to a[i]
{
    int ans=0;
    while(i>0)
    {
        ans+=c[i];
        i-=lowbit(i);
    }
    return ans;
}

 

线段树:

#define maxn 100007
int sum[maxn<<2],a[maxn];
void merge(int rt)
{
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt)
{
    if(l==r)
    {
        sum[rt]=a[l];return;
    }
    int m=(l+r)>>1;
    build(l,m,rt<<1);
    build(m+1,r,rt<<1|1);
    merge(rt);
}
void update(int x,int c,int l,int r,int rt)//a[x]+=c
{
    if(l==r)
    {
        sum[rt]+=c;return;
    }
    int m=(l+r)>>1;
    if(x<=m) update(x,c,l,m,rt<<1);
    else update(x,c,m+1,r,rt<<1|1);
    merge(rt);
}
int getsum(int L,int R,int l,int r,int rt)
{
    if(L<=l&&R>=r) return sum[rt];
    int m=(l+r)>>1,ans=0;
    if(L<=m) ans+=getsum(L,R,l,m,rt<<1);
    if(R>m) ans+=getsum(L,R,m+1,r,rt<<1|1);
    return ans;
}

 

这篇关于Data Structure的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!