CSP-S2020/NOIP2020模板总结(Updating)

CSP-S2020/NOIP2020模板总结

一、算法

二分写法

while(l<=r)
{
	int mid=(l+r)>>1;
	if(check(mid))
	{
		l=mid+1;
		ans=mid;
	}
	else
		r=mid-1;
}

洛谷2884

离散化


UVA10587

归并排序

void merge_sort(int l,int r)
{
	if(l==r)
		return;
	int mid=(l+r)>>1;
	merge_sort(l,mid);
	merge_sort(mid+1,r);
	int i=l,j=mid+1,k=l;
	while(i<=mid && j<=r)
	{
		if(a[i]<=a[j])
			b[k++]=a[i++];
		else
		{
			b[k++]=a[j++];
			ans+=mid-i+1;
		}
	}
	while(i<=mid)
		b[k++]=a[i++];
	while(j<=r)
		b[k++]=a[j++];
	for(int p=l;p<=r;p++)
		a[p]=b[p],b[p]=0;
}

JDOJ1927


二、数学

判断素数

bool isprime(int x)
{
	for(int i=2;i<=sqrt(x);i++)
		if(x%i==0)
			return 0;
	return 1;
}

欧拉筛素数

void euler(int x)
{
	cnt=0;
	memset(v,0,sizeof(v));
	for(int i=2;i<=x;i++)
	{
		if(!v[i])
			prime[++cnt]=i;
		for(int j=1;j<=cnt && i*prime[j]<=x;j++)
		{
			v[i*prime[j]]=1;
			if(i%prime[j]==0)
				break;
		}
	}
}

GCD

int gcd(int a,int b)
{
	return !b?a:gcd(b,a%b);
}

EX-GCD

int exgcd(int a,int b)
{
	if(!b)
	{
		x=1;
		y=0;
		return a;
	}
	int d=ecgcd(b,a%b);
	int k=x;
	x=y;
	y=x-a/b*y;
	return d;
}

洛谷1082

二项式系数、杨辉三角


洛谷1313

线性求逆元

void ny(int n)
{
	for(int i=1;i<=n;i++)
		inv[i]=((mod-mod/i)*inv[mod%i])%mod;
}

洛谷3811

快速幂

int qpow(int a,int b)
{
	int ret=1;
	while(b)
	{
		if(b&1)
			ret=(ret*a)%mod;
		a=(a*a)%mod;
		b>>=1;
	}
	return ret;
}

矩阵快速幂


高斯消元


洛谷3389


三、树与图

链式前向星

void add(int x,int y)
{
	to[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}

Dijkstra


Dijkstra+堆优化

priority_queue<pair<int,int> >q;
void dijkstra(int s)
{
	memset(dist,127,sizeof(dist));
	memset(v,0,sizeof(v));
	dist[s]=0;
	q.push(make_pair(0,s));
	while(!q.empty())
	{
		int x=q.top().second;
		q.pop();
		if(v[x])
			continue;
		v[x]=1;
		for(int i=head[x];i;i=nxt[i])
		{
			int y=to[i];
			if(dist[y]>dist[x]+val[i])
			{
				dist[y]=dist[x]+val[i];
				q.push(make_pair(-dist[y],y));
			}
		}
	}
}

SPFA

void spfa(int s)
{
	memset(dist,127,sizeof(dist));
	memset(v,0,sizeof(v));
	dist[s]=0;
	q.push(s);
	v[s]=1;
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		v[x]=0;
		for(int i=head[x];i;i=nxt[i])
		{
			int y=to[i];
			if(dist[y]>dist[x]+val[i])
			{
				dist[y]=dist[x]+val[i];
				if(!v[y])
					q.push(y),v[y]=1;
			}
		}
	}
}

SPFA+SLF优化


SPFA+LLL优化


Floyd

//普及-模板,略

Kruskal

int find(int x)
{
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
void kruskal()
{
	sort(e+1,e+tot+1,cmp);
	for(int i=1;i<=tot;i++)
	{
		int fx=find(e[i].x);
		int fy=find(e[i].y);
		if(fx!=fy)
		{
			add(e[i].y,e[i].x);
			add(e[i].x,e[i].y);
			fa[fx]=fy;
		}
	}
}

JDOJ1229

Prim

//它死了

树上倍增


JDOJ3055
CF587C

树链剖分

//普及-模板,略

拓扑排序

void topsort()
{
	queue<int> q;
	for(int i=1;i<=n;i++)
		if(!du[i])
			q.push(i);
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		for(int i=head[x];i;i=nxt[i])
		{
			int y=to[i];
			du[y]--;
			if(!du[y])
				q.push(y);
		}
	}
}

洛谷1038


四、数据结构

线段树

//普及-模板,略

动态开点(线段树)

//普及-模板,略

主席树

struct persistent_segment_tree
{
	int v,lson,rson;
}tree[maxn*30];
void pushup(int pos)
{
	tree[pos].v=tree[tree[pos].lson].v+tree[tree[pos].rson].v;
}
void build(int &pos,int l,int r)
{
	if(!pos)
		pos=++tot;
	int mid=(l+r)>>1;
	if(l==r)
	{
		tree[pos].v=a[l];
		return;
	}
	build(tree[pos].lson,l,mid);
	build(tree[pos].rson,mid+1,r);
	pushup(pos);
}
int newnode(int pos)
{
	tree[++tot]=tree[pos];
	return tot;
}
int update(int pos,int l,int r,int x,int k)
{
	int mid=(l+r)>>1;
	pos=newnode(pos);
	if(l==r)
	{
		tree[pos].v=k;
		return pos;
	}
	if(x<=mid)
		tree[pos].lson=update(tree[pos].lson,l,mid,x,k);
	else
		tree[pos].rson=update(tree[pos].rson,mid+1,r,x,k);
	return pos;
}

洛谷3919

Splay


洛谷3369

并查集

int find(int x)
{
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(int x,int y)
{
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy)
		fa[fx]=fy;
}

JDOJ1046

洛谷1196

树状数组


洛谷模板

ST表


洛谷模板


五、字符串

Hash

int hash(char s[])
{
	int ret=0;
	int len=strlen(s+1);
	for(int i=1;i<=len;i++)
	{
		ret=ret*31+s[i]-'a';
		ret%=mod;
	}
	return ret%mod;
}

洛谷1381

Trie


洛谷模板

KMP


posted @ 2020-10-26 16:44  Seaway-Fu  阅读(255)  评论(3编辑  收藏  举报