「模板」数据结构

莫队

#include
#include
#include
#include
#include
using namespace std;
const int N=50005;
int n,m,k;
int cnt[N],a[N],size,p,ans[N];
struct query
{
    int l,r,id,bel;
}q[N];
int cmp(query x,query y)
{
    return x.bel!=y.bel?x.ly.r); 
}
int read()
{
    int x=0;char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x;
}

int main()
{
    n=read();m=read();k=read();
    size=(int)sqrt(n);
    for(int i=1;i<=n;i++)
        a[i]=read();
    for(int i=1;i<=m;i++)
        q[i].l=read(),q[i].r=read(),q[i].id=i,q[i].bel=(q[i].l-1)/size+1;
    sort(q+1,q+m+1,cmp);
    /*for(int i=1;i<=m;i++)
        cout<ql)l--,cnt[a[l]]++,p+=2*cnt[a[l]]-1;
        while(rqr)cnt[a[r]]--,p-=2*cnt[a[r]]+1,r--;
        ans[q[i].id]=p;
    }
    for(int i=1;i<=m;i++)
        cout< 
 

 

ST表

#include
#include
#include
using namespace std;
const int N=100005;
int n,m;
int st[N][20],a[N];
int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int lg[N]={-1};
void ini()
{
    for(int i=1;i<=n;i++)
        st[i][0]=a[i],lg[i]=lg[i>>1]+1;
    for(int i=1;i<=lg[n];i++)
        for(int j=1;j+(1< 
 

 

主席树

#include
#include
#include
using namespace std;
const int N=100005;
int type,n,m,side;
int sum[N*20],root[N*20],ls[N*20],rs[N*20];
int a[N],b[N];
inline int read()
{
	int f=1,x=0;char ch=getchar();
	while(ch<'0'||ch>'9')
	{if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')
	{x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
void build(int &k,int l,int r)
{
	k=++type;
	sum[k]=0;
	if(l==r)return ;
	int mid=l+r>>1;
	build(ls[k],l,mid);
	build(rs[k],mid+1,r);
}
void update(int &k,int l,int r,int time,int val)
{
	k=++type;
	ls[k]=ls[time];
	rs[k]=rs[time];
	sum[k]=sum[time]+1;
	if(l==r)return ;
	int mid=l+r>>1;
	if(val<=mid)update(ls[k],l,mid,ls[time],val);
	else update(rs[k],mid+1,r,rs[time],val);
}
int query(int k1,int k2,int l,int r,int val)
{
	if(l==r)return l;
	int mid=l+r>>1;
	int cnt=sum[ls[k2]]-sum[ls[k1]];
	if(val<=cnt)return query(ls[k1],ls[k2],l,mid,val);
	else return query(rs[k1],rs[k2],mid+1,r,val-cnt);
}
void work()
{
	int l=read(),r=read(),val=read();
	int ans=query(root[l-1],root[r],1,side,val);
	printf("%d\n",b[ans]);
}
int main()
{
	n=read();m=read();
	for(int i=1;i<=n;i++)a[i]=read(),b[i]=a[i];
	sort(b+1,b+n+1);
	side=unique(b+1,b+n+1)-b-1;
	build(root[0],1,side);
	for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+side+1,a[i])-b;
	for(int i=1;i<=n;i++)update(root[i],1,side,root[i-1],a[i]);
	while(m--)work();
	return 0; 
}

 

树剖

#include
#include
#include
#define QwQ std;
using namespace QwQ;
#define ls(k) k<<1
#define rs(k) k<<1|1
const int N=50010;
int n,m;
int size[N],son[N],top[N],seg[N],rev[N],dep[N];
int fa[N],num[N];
int to[N<<1],head[N<<1],nxt[N<<1];
long long mx[N<<2],sum[N<<2],ress,resm;
void query(int k,int l,int r,int L,int R)
{
	if(L>r||R>1;
	if(mid>=L)query(ls(k),l,mid,L,R);
	if(mid+1<=R)query(rs(k),mid+1,r,L,R);
}
void change(int k,int l,int r,int vl,int pos)
{
	if(pos>r||pos>1;
	if(mid>=pos)change(ls(k),l,mid,vl,pos);
	if(mid+1<=pos)change(rs(k),mid+1,r,vl,pos);
	sum[k]=sum[ls(k)]+sum[rs(k)];
	mx[k]=max(mx[ls(k)],mx[rs(k)]);
}
void dfs1(int x,int y)
{
	size[x]=1;
	fa[x]=y;
	dep[x]=dep[y]+1;
	int end;
	for(int i=head[x];i,end=to[i];i=nxt[i])
	{
		if(end!=y)
		{
			dfs1(end,x);
			size[x]+=size[end];
			if(size[end]>size[son[x]])son[x]=end;
		}
	}
}
void dfs2(int x,int f)
{
	if(son[x])
	{
		seg[son[x]]=++seg[0];
		top[son[x]]=top[x];
		rev[seg[0]]=son[x];
		dfs2(son[x],x);
	}
	int y;
	for(int i=head[x];i,y=to[i];i=nxt[i])
	{
		if(!top[y])
		{
			seg[y]=++seg[0];
			rev[seg[0]]=y;
			top[y]=y;
			dfs2(y,x);
		}
	}
}
void build(int k,int l,int r)
{
	int mid=l+r>>1;
	if(l==r)
	{
		mx[k]=sum[k]=num[rev[l]];
		return ;
	}
	build(ls(k),l,mid);
	build(rs(k),mid+1,r);
	sum[k]=sum[ls(k)]+sum[rs(k)];
	mx[k]=max(mx[ls(k)],mx[rs(k)]);
}
int tot=0;
void add(int x,int y)
{
	to[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}
void ask(int x,int y)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]seg[y])swap(x,y);
	query(1,1,seg[0],seg[x],seg[y]);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i 
 

 

你可能感兴趣的:(「模板」数据结构)