各种模板(part 1)

时间:2023-03-09 05:09:58
各种模板(part 1)

GCD:

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

快速幂:

 void work(int x,int y)  //x^y
{
int ans=;
while(y!=)
{
if(y%==)
ans=ans*x;
y=y/;
x=x*x;
}
}

归并排序:

 void work(int l,int r)
{
int i,j,tmp,mid;
if(l+<r)
{
mid=(l+r)/;
tmp=l;
work(l,mid-);
work(mid,r);
for(i=l,j=mid;i<mid&&j<=r;)
{
if(a[i]>a[j])
c[tmp++]=a[j++];
else
c[tmp++]=a[i++];
}
if(j<=r)
for(;j<=r;j++)
c[tmp++]=a[j];
else
for(;i<mid;i++)
a[tmp++]=a[i];
for(i=l;i<=r;i++)
a[i]=c[i];
}
else
{
if(l+==r)
{
if(a[l]>a[r])
{
sawp(a[l],a[r]);
}
}
}
}

二分:

 int find(int l;int r)
{
int mid=(l+r)/;
while(l+<r)
{
if(mid==条件) return mid;
if(mid<条件) l=mid;
if(mid>条件) r=mid;
}
if(l==条件) return l;
if(r==条件) return r;
return -;//没有满足条件的
}

静态链表:

 struct node    //静态链表
{
int v,n;
}a[maxn];
int top;
void cha_ru(int x,int y) //把y查到第x个元素后
{
top++;
a[top].v=y;
a[top].n=a[x].n;
a[x].n=top;
}
void delet(int x) //把x的下一个元素删除
{
a[x].n=a[a[x].n].n;
}

栈:

 int q[maxn],top=;
void push(int x)
{
q[++top]=x;
}
int pop()
{
return q[top--];
}

队列:

 int q[maxn],tail=,head=;
void push(int x)
{
q[++tail]=x;
}
int pop()
{
return a[++head];
}

二叉树:

 struct node //树
{
int v;
int lc,rc;
int id;
int pa;
}a[maxn];
int top=;
int head=;
void qian(int p) //前序遍历
{
if(p==)
return ;
cout<<a[p].v;
qian(a[p].lc);
qian(a[p].rc);
}
void zhong(int p) //中序遍历
{
if(p==)
return ;
zhong(a[p].lc);
cout<<a[p].v;
zhong(a[p].rc);
}
void hou(int p) //后序遍历
{
if(p==)
return ;
hou(a[p].lc);
hou(a[p].rc);
cout<<a[p].v;
}
//树的数组储存
//设有n各节点的树,操作t节点 根节点为1 到n
t.father=t/; //父亲
t.lchild=*t; //左儿子
t.rchild=*t+; //右儿子
t.lbrother=t-; //左兄弟
t.rbrother=t+; //右兄弟

并查集:

 using namespace bing_cha_ji //并查集
{
int fa[maxn];
for(int i=;i<=n;i++)
fa[i]=i;
int getfa(int k) //找爹
{
if(fa[k]==k) return k;
fa[k]=get(fa[k]);
return fa[k];
}
void merge(int x,int y) //合并
{
int fx=getfa(x);
int fy=getfa(y);
fa[fx]=fy;
}
bool judge(int x,int y) //判断是否为一个祖先
{
int fx=getfa(x);
int fy=getfa(y);
return fx==fy;
}
}