基础数据结构

rt,数据结构模板,主要是用来保存,需要的也可以拿去用αωα

ST表(区间最大值模板):

#include
using namespace std;
const int N=1e5*2+10,M=18;
int w[N],f[N][M],n,m;
void init()
{
    for(int j=0;j

单调队列模板:

#include
using namespace std;
const int N=1000010;
int a[N],q[N]; 
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=0;iq[hh]) hh++;
    	while(hh<=tt and a[q[tt]]>=a[i]) tt--;
		q[++tt]=i;
		if(i>=k-1) printf("%d ",a[q[hh]]); 
	}
	printf("\n");
	hh=0,tt=-1;
	for(int i=0;iq[hh]) hh++;
		while(hh<=tt and a[q[tt]]<=a[i]) tt--;
		q[++tt]=i;
		if(i>=k-1) printf("%d ",a[q[hh]]);
	}
    return 0;
}
//题目链接:https://www.acwing.com/problem/content/description/156/

/************************************************/
#include
using namespace std;    
const int N=300010,INF=1e9;
int n,m;
int s[N],q[N];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&s[i]),s[i]+=s[i-1];
    int res=-INF;
    int hh=0,tt=0;
    for(int i=1;i<=n;i++)
    {
        if(q[hh]=s[i]) tt--;
        q[++tt]=i;
    }
    printf("%d",res);   
	return 0;
}
//题目链接:https://www.acwing.com/problem/content/description/137/

树状数组模板:1 ,2

线段树模板:

(线段树2模板,洛谷P3373 )

#include
using namespace std;
typedef long long LL;?
const int N=100010;
int n,p,m;
int w[N];
struct Node?
{
    int l,r;
    int sum,add,mul;
}tr[N*4];?
void pushup(int u)
{
    tr[u].sum=(tr[u<<1].sum+tr[u<<1|1].sum)%p;?
}
void eval(Node &t,int add,int mul)
{
    t.sum=((LL)t.sum*mul+(LL)(t.r-t.l+1)*add)%p;?
    t.mul=(LL)t.mul*mul%p;
    t.add=((LL)t.add*mul+add)%p;
}
void pushdown(int u)?
{
    eval(tr[u<<1],tr[u].add,tr[u].mul);
    eval(tr[u<<1|1],tr[u].add,tr[u].mul);
    tr[u].add=0,tr[u].mul=1;?
}
void build(int u,int l,int r)
{
    if(l==r) tr[u]={l,r,w[r],0,1};?
    else
    {
        tr[u]={l,r,0,0,1};?
        int mid=(l+r)>>1;
        build(u<<1,l,mid),build(u<<1|1,mid+1,r);
        pushup(u);
    }
}?
void modify(int u,int l,int r,int add,int mul)
{
    if(tr[u].l>=l and tr[u].r<=r) eval(tr[u],add,mul);?
    else
    {?
        pushdown(u);
        int mid=(tr[u].l+tr[u].r)>>1;?
        if(l<=mid) modify(u<<1,l,r,add,mul);
        if(r>mid) modify(u<<1|1,l,r,add,mul);
        pushup(u);
    }?
}?
int query(int u,int l,int r)
{
    if(tr[u].l>=l and tr[u].r<=r) return tr[u].sum;
    pushdown(u);
    int mid=(tr[u].l+tr[u].r)>>1;??
    int sum=0;
    if(l<=mid) sum=qu?ery(u<<1,l,r);
    if(r>mid) sum=(sum+query(u<<1|1,l,r))%p;
    return sum;?
}
int main()
{
	scanf("%d%d%d",&n,&p);?
	for(int i=1;i<=n;i++) scanf("%d",&w[i]);?
	build(1,1,n);?
	scanf("%d",&m);?
	while(m--)?
	{?
	    int t,l,r,d;
	    scanf("%d%d%d", &t,&l,&r);?
	    if(t==1)?
	    {?
	        scanf("%d",&d);??
	        modify(1,l,r,0,d);?
	    }??
	    else if(t==2)?
	    {?
	        scanf("%d",&d);?
	        modify(1,l,r,d,1);?
	    }?
	    else printf("%d\n",query(1,l,r));?
	}?
	return 0;?
}

没了.平衡树模板(Treap,splay)到时候放

你可能感兴趣的:(模板)