ACM个人零散知识点整理

杂项:

1.输入输出外挂

//读入优化 int 整数
inline 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;
}

2.关闭c+++输入输出限制流

使用的时候一定放在所有cin,cout的开头,不然会导致输入的内容发生错乱

ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

图论:

1.链式前向星模板

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
//init()
struct edgenode {
    int w,next,to;
    edgenode () {
        next=w=to=0;
    }
} edges[maxn];
int head[maxn];
int cnt=0;
//双向边调用两次即可
void addedge(int u, int v, int w) {
    edges[cnt].to=v;
    edges[cnt].w=w;
    edges[cnt].next=head[u];
    head[u]=cnt;
    cnt++;
}
//遍历
void ask(int x) {
    for(int i=head[x];i!=-1;i=edges[i].next) {

    }
}
void init() {
    memset(head,-1,sizeof(head));
}
int main() {

    return 0;
}

2.最近公共祖先

  • tarjan离线

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 500001;
    const int maxm = 1000001;
    struct enode {
    int next,to;
    } edges[maxm];
    struct qnode {
    int next,id,to;//id第几次查询
    } que[maxm];
    int head_e[maxn];//前向星 edges
    int head_q[maxn];//前向星 查询
    int vis[maxn];
    int f[maxn];//并查集父亲数组
    int res[maxn];//结果
    int cnte=0;
    int cntq=0;
    int n,m,s;
    inline void addedge(int u, int v) {
    edges[cnte].to=v;
    edges[cnte].next=head_e[u];
    head_e[u]=cnte++;
    }
    inline void addque(int u, int v, int id) {
    que[cntq].to=v;
    que[cntq].id=id;
    que[cntq].next=head_q[u];
    head_q[u]=cntq++;
    }
    //并查集访问父亲
    int find(int x) {
    return x==f[x] ? x : f[x] = find(f[x]);//压缩
    }
    void tarjan(int s) {
    vis[s]=1;//先标记,不能在回溯时标记,因为双向边
    f[s]=s;
    for(int i=head_e[s]; i!=-1; i=edges[i].next) {
        if(!vis[edges[i].to]) {
            tarjan(edges[i].to);
            f[edges[i].to]=s;
        }
    }
    for(int i=head_q[s]; i!=-1; i=que[i].next) {
        if(vis[que[i].to]==1) {
            res[que[i].id]=find(que[i].to);
        }
    }
    }
    inline void init() {
    memset(vis,0,sizeof(vis));
    memset(head_e,-1,sizeof(head_e));
    memset(head_q,-1,sizeof(head_q));
    for(int i=1; i<=n; ++i) f[i]=i;
    }
    int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m>>s;
    init();
    int u,v;
    for(int i=1; i<n; ++i) {
        cin>>v>>u;
        addedge(v,u);
        addedge(u,v);
    }
    for(int i=1; i<=m; ++i) {
        cin>>v>>u;
        addque(u,v,i);
        addque(v,u,i);
    }
    tarjan(s);
    for(int i=1; i<=m; ++i) cout<<res[i]<<endl;
    return 0;
    }
  • ST倍增在线

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    using namespace std;
    const int maxn = 100005;
    struct node {
    int to,next;
    } edges[maxn<<1];
    //注意head[]数组初始化
    int head[maxn],cnt,dp[maxn][15],dep[maxn];
    void add(int u, int v) {
    edges[cnt].to=v;
    edges[cnt].next=head[u];
    head[u]=cnt++;
    }
    //节点 父亲节点
    void dfs(int s, int x) {
    dp[s][0]=x;
    dep[s]=dep[x]+1;
    int t;
    //跟新到根节点一路上的祖先
    for(int i=1; (1<<i)<=dep[x]; ++i) dp[s][i]=dp[dp[s][i-1]][i-1];
    for(int i=head[s]; i!=-1; i=edges[i].next) {
        t=edges[i].to;
        if(t==x) continue;
        dfs(t,s);
    }
    }
    int lca(int u, int v) {
    if(dep[v]>dep[u]) swap(u,v);
    for(int i=14; i>=0; --i) {
        if((dep[u]-dep[v])>=(1<<i)) {
            u=dp[u][i];
        }
    }
    //此时深度一定相同
    if(u==v) return u;
    for(int i=14; i>=0; --i) {
        if((1<<i)<=dep[u]&&dp[u][i]!=dp[v][i]) {
            u=dp[u][i];
            v=dp[v][i];
        }
    }
    //循环过程中不加判断可能会超过最近公共祖先,所以跟新到lca的儿子节点即可
    return dp[u][0];
    }
    int main() {
    int n,m,u,v;
    scanf("%d %d",&n,&m);
    cnt=0;
    memset(head,-1,sizeof(head));
    for(int i=1; i<n; ++i) {
        scanf("%d %d",&u,&v);
        add(u,v);
        add(v,u);
    }
    dep[0]=1;
    dfs(1,1);
    for(int i=1; i<=m; ++i) {
        scanf("%d %d",&u,&v);
        printf("%d\n",lca(u,v));
    }
    return 0;
    }

    数论:

    1.快速幂(矩阵快速幂略)

    int pow(int base,int num){
    int ans=1;
    while(num!=0){
        if(num&1!=0)
          ans*=base;
        base<<=1;
        b>>=1;
      }
    return ans;
    }

    2.位数公式

    x=log(n)+1//求n有多少位

    3.莫比乌斯函数

  • 在线

    ll mubi(ll n) {
    ll mu=1;
    for(ll i=2;i*i<=n;++i) {
        if(n%i==0) {
            mu*=-1;
            ll k=0;
            do {
                k++;
                if(k>1) {
                    mu=0;break;
                }
                n/=i;
            }while(n%i==0);
        }
    }
    if(n>1) mu*=-1;
    return mu;
    }
  • 离线

    mu[1]=1;
    for(i=2;i<=n;i++)
    {
    if(!not_prime[i])
    {
        prime[++tot]=i;
        mu[i]=-1;
    }
    for(j=1;prime[j]*i<=n;j++)
    {
        not_prime[prime[j]*i]=1;
        if(i%prime[j]==0)
        {
            mu[prime[j]*i]=0;
            break;
        }
        mu[prime[j]*i]=-mu[i];
    }
    }

    4.最小正整数逆元(ex_gcd)

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll exgcd(ll a, ll b, ll &x, ll &y) {
    if(!b) {
        x=1;y=0;return a;
    }
    ll ans=exgcd(b,a%b,x,y);
    ll temp=x;
    x=y;
    y=temp-a/b*y;
    return ans;
    }
    int main() {
    ios::sync_with_stdio(false);
    ll m,n;
    cin>>m>>n;
    ll x,y;
    exgcd(m,n,x,y);
    cout<<((x%n)+n)%n<<endl;
    return 0;
    }

ACM个人零散知识点整理的更多相关文章

  1. Android 零散知识点整理

    Android 零散知识点整理 为什么Android的更新试图操作必须在主线程中进行? 这是因为Android系统中的视图组件并不是线程安全的.通常应该让主线程负责创建.显示和更新UI,启动子线程,停 ...

  2. NDK开发-零散知识点整理

    JavaVM 标准Java平台下,每一个Process可以产生很多JavaVM对象,但在Android平台上,每一个Process只能产生一个Dalvik VM对象,也就是说在Android进程中是通 ...

  3. vue前端面试题知识点整理

    vue前端面试题知识点整理 1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...

  4. kafka知识点整理总结

    kafka知识点整理总结 只不过是敷衍 2017-11-22 21:39:59 kafka知识点整理总结,以备不时之需. 为什么要使用消息系统: 解耦 并行 异步通信:想向队列中放入多少消息就放多少, ...

  5. JSP页面开发知识点整理

    刚学JSP页面开发,把知识点整理一下. ----------------------------------------------------------------------- JSP语法htt ...

  6. JS知识点整理(二)

    前言 这是对平时的一些读书笔记和理解进行整理的第二部分,第一部分请前往:JS知识点整理(一).本文包含一些易混淆.遗漏的知识点,也会配上一些例子,也许不是很完整,也许还会有点杂,但也许会有你需要的,后 ...

  7. Android零散知识点积累

    本文仅在记录android开发中遇到的零散知识点,会不断更新... 目录 .隐藏系统标题栏 .图片尺寸及屏幕密度 3.获取顶部状态栏高度 1.隐藏系统标题栏 1)在资源文件styles.xml中定义样 ...

  8. css入门知识点整理

    css入门知识点整理 不要嘲笑我这个蒟蒻..例子来源:w3school css其实就分为两个东西,一个是选择器,另外一个是声明.声明定义了某个对象的属性的值,这都是html的内容.重点要关注的是选择器 ...

  9. activity生命周期知识点整理

    activity生命周期知识点整理 Activity: 是一个应用组件,用户可与其提供的屏幕进行交互.窗口通常会充满屏幕,但也可以小于屏幕并浮动在其他窗口之上. 一个activity的什么周期: 启动 ...

随机推荐

  1. JMeter 压力测试使用CSV参数

    表示之前从没用过JMeter所以记录一下使用过程 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测 ...

  2. YYHS-猜数字(并查集/线段树维护)

    题目描述     LYK在玩猜数字游戏.    总共有n个互不相同的正整数,LYK每次猜一段区间的最小值.形如[li,ri]这段区间的数字的最小值一定等于xi.     我们总能构造出一种方案使得LY ...

  3. 一个强大的封装好的pdo处理类

    php5.5后就不支持mysql扩展了,也就是说这以后都不能使用msyql_conncet之类的函数了.不过没有关系,pdo比mysql有更多优势,写法也很简单,下面贴出一个来自互联网的pdo处理类. ...

  4. Branch Prediction

    Pipeline的优点 现代微处理器的pipeline中包含许多阶段,粗略地可以分成fetch.decode.execution.retirement,细分开来可以分成十多甚至二十多个阶段.在处理器处 ...

  5. js 作用域,作用域链,闭包

    什么是作用域? 作用域是一种规则,在代码编译阶段就确定了,规定了变量与函数的可被访问的范围.全局变量拥有全局作用域,局部变量则拥有局部作用域. js是一种没有块级作用域的语言(包括if.for等语句的 ...

  6. onload、DOMContentLoaded与性能问题

    onload.DOMContentLoaded与性能问题 onload事件 DomContentLoaded   1.onload事件 onload事件一般在所有的文档内容加载完成后触发,如果网页中图 ...

  7. progress 相关事件 异步 ajax

    loadstart — Fires when the fi rst byte of the response has been received.progress — Fires repeatedly ...

  8. Golang源码探索(二) 协程的实现原理

    Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻 ...

  9. Python 解LeetCode:654. Maximum Binary Tree

    用一个整型数组构建一个二叉树,根结点是数组中的最大值,左右子树分别是根结点的值在数组中左右两边的部分. 分析,这是二叉树中比较容易想到的问题了,直接使用递归就行了,代码如下: class Soluti ...

  10. Java实现TFIDF算法

    算法介绍 最近要做领域概念的提取,TFIDF作为一个很经典的算法可以作为其中的一步处理. 关于TFIDF算法的介绍可以参考这篇博客http://www.ruanyifeng.com/blog/2013 ...