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