Noip 2017 考前

来源:互联网 发布:网络直播怎么做 编辑:程序博客网 时间:2024/05/21 08:57
  • tarjan缩点
void tarjan(int u)  {      dfn[u]=low[u]=++Time;      ins[u]=1; s[++top]=u;      for (int i=head[u];i;i=e[i].next)      if (!dfn[to])      {          tarjan(to);          low[u]=min(low[u],low[to]);      }      else if (ins[to]) low[u]=min(low[u],dfn[to]);      if (dfn[u]==low[u])      {          ++num;          do           {              now=s[top--];              ins[now]=0;              bl[now]=num;          }          while (u^now);      }  }  for (int i=1;i<=n;i++) if (!dfn[i]) tarjan(i);
  • LCA
void dfs(int u){    vis[u]=1;    for(int i=head[u];i;i=e[i].next)        if (!vis[to])        {            p[to][0]=u;            deep[to]=deep[u]+1;            dfs(to);        }}void RMQ(){    for (int j=1;(1<<j)<=n;j++)    for (int i=1;i<=n;i++)        if (p[i][j-1]) p[i][j]=p[p[i][j-1]][j-1];}int query(int x,int y){    if (deep[x]<deep[y]) swap(x,y);    int k=0,j;while (1<<(k+1)<=deep[x]) k++;    for (j=k;~j;j--) if (deep[x]-(1<<j)>=deep[y]) x=p[x][j];    if (x==y) return x;    for (j=k;~j;j--) if (p[x][j]^p[y][j]) x=p[x][j],y=p[y][j];    return p[x][0];}
  • 最小生成树
int find(int x) {return x==father[x]?x:father[x]=find(father[x]);}int main(){    n=read(); m=read();    for (int i=1;i<=m;i++)    {        int u=read(),v=read(),w=read();        a[i].x=u; a[i].y=v; a[i].z=w;    }    sort(a+1,a+m+1,cmp); sum=0;    for (int i=1;i<=n;i++) father[i]=i;    for (int i=1;i<=m;i++)    {        int fx=find(a[i].x),fy=find(a[i].y);        if (fx==fy) continue;        father[fx]=fy; sum+=a[i].z; num++;    }    if (num==n-1) printf("%d",sum); else printf("orz");    return 0;}
  • 树状数组
void insert(int x,int w) {if (x==0) return; for (;x<=n;x+=x&-x) t[x]+=w;}int query(int x) {int sum=0; for (;x;x-=x&-x) sum+=t[x]; return sum;}
  • 哈希
#define ll unsigned long longll gt(int x,int y) {return (hash[y]-hash[x-1]*mi[y-x+1]);}for (ll i=1;i<=N;i++) mi[i]=mi[i-1]*S;for (ll i=1;i<=l1;i++) hash[i]=(hash[i-1]*S+s1[i]-'A'+1);
  • 线性筛
void Prime(int N){    vis[1]=1;    for (int i=2;i<=N;i++)    {        if (!vis[i]) P[++num]=i;        for (int j=1;j<=num&&i*P[j]<=N;j++)        {            vis[i*P[j]]=1;            if (i%P[j]==0) break;        }    }}
  • 扩展欧几里得
 void exgcd(int a,int b,int &d,int &x,int &y){    if (!b) {d=a,x=1,y=0;}    else {gcd(b,a%b,d,y,x); y-=x*(a/b);}}(x,y)=(x0+k*b’,y0-k*a’) a’=a/gcd(a,b) 
  • 快速幂
while (b) {if (b&1) ans=ans*a; b>>=1; a=a*a;} 
void in(int x){    a[++size]=x;    now=size;    while (now>1)    {        next=now>>1;        if (a[next]<=a[now]) break;        swap(a[next],a[now]);        now=next;    }}int out(){    int res=a[1];    a[1]=a[size--];    now=1;    while (now*2<=size)    {        next=now<<1;        if (next+1<=size && a[next]>a[next+1]) next++;        if (a[next]>=a[now]) break;        swap(a[next],a[now]);        now=next;    }    return res;}
原创粉丝点击