高斯消元模板(kuangbin版)

    //基本版  
    #include<stdio.h>  
    #include<algorithm>  
    #include<iostream>  
    #include<string.h>  
    #include<math.h>  
    using namespace std;  

    const int MAXN=50;  



    int a[MAXN][MAXN];//增广矩阵  
    int x[MAXN];//解集  
    bool free_x[MAXN];//标记是否是不确定的变元  



    /* 
    void Debug(int equ,int var) 
    { 
        int i, j; 
        for (i = 0; i < equ; i++) 
        { 
            for (j = 0; j < var + 1; j++) 
            { 
                cout << a[i][j] << " "; 
            } 
            cout << endl; 
        } 
        cout << endl; 
    } 


    */  


    inline int gcd(int a,int b)  
    {  
        int t;  
        while(b!=0)  
        {  
            t=b;  
            b=a%b;  
            a=t;  
        }  
        return a;  
    }  
    inline int lcm(int a,int b)  
    {  
        return a/gcd(a,b)*b;//先除后乘防溢出  
    }  

    // 高斯消元法解方程组(Gauss-Jordan elimination).(-2表示有浮点数解,但无整数解,  
    //-1表示无解,0表示唯一解,大于0表示无穷解,并返回自由变元的个数)  
    //有equ个方程,var个变元。增广矩阵行数为equ,分别为0到equ-1,列数为var+1,分别为0到var.  
    int Gauss(int equ,int var)  
    {  
       int i,j,k;  
        int max_r;// 当前这列绝对值最大的行.  
        int col;//当前处理的列  
        int ta,tb;  
        int LCM;  
        int temp;  
        int free_x_num;  
        int free_index;  

        for(int i=0;i<=var;i++)  
        {  
            x[i]=0;  
            free_x[i]=true;  
        }  

        //转换为阶梯阵.  
        col=0; // 当前处理的列  
        for(k = 0;k < equ && col < var;k++,col++)  
        {// 枚举当前处理的行.  
    // 找到该col列元素绝对值最大的那行与第k行交换.(为了在除法时减小误差)  
            max_r=k;  
            for(i=k+1;i<equ;i++)  
            {  
                if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;//abs是整数取绝对值,fabs是浮点数取绝对值  
            }  
            if(max_r!=k)  
            {// 与第k行交换.  
                for(j=k;j<var+1;j++) swap(a[k][j],a[max_r][j]);  
            }  
            if(a[k][col]==0)  
            {// 说明该col列第k行以下全是0了,则处理当前行的下一列.  
                k--;  
                continue;  
            }  
            for(i=k+1;i<equ;i++)  
            {// 枚举要删去的行.  
                if(a[i][col]!=0)  
                {  
                    /* 
                        如果是两两之间是异或而不是加的话,那么按照方案二 
                    */  
                    //方案一  
                    LCM = lcm(abs(a[i][col]),abs(a[k][col]));  
                    ta = LCM/abs(a[i][col]);  
                    tb = LCM/abs(a[k][col]);  
                    if(a[i][col]*a[k][col]<0)tb=-tb;//异号的情况是相加  
                    for(j=col;j<var+1;j++)  
                    {  
                        a[i][j] = a[i][j]*ta-a[k][j]*tb;  
                    }  
                    /*方案二 
                    for(j=col;j<var+1;j++) 
                    { 
                       // 枚举要删去的行. 
                        a[i][j] ^= a[k][j]; 
                    }*/  
                }  
            }  
        }  

      //  Debug();  

        // 1. 无解的情况: 化简的增广阵中存在(0, 0, ..., a)这样的行(a != 0).  
        for (i = k; i < equ; i++)  
            //表示k还没到尽头,但col已经到了变量那一列。这就意味着后面的几行只有一个常量,如果常量不是0.则无解  
        { // 对于无穷解来说,如果要判断哪些是自由变元,那么初等行变换中的交换就会影响,则要记录交换.  
            if (a[i][col] != 0) return -1;  
        }  
        // 2. 无穷解的情况: 在var * (var + 1)的增广阵中出现(0, 0, ..., 0)这样的行,即说明没有形成严格的上三角阵.  
        // 且出现的行数即为自由变元的个数.  
        if (k < var)  
        {  
            /*以下到return之前均为求变元*/  
            // 首先,自由变元有var - k个,即不确定的变元至少有var - k个.  
            for (i = k - 1; i >= 0; i--)  
            {  
                // 第i行一定不会是(0, 0, ..., 0)的情况,因为这样的行是在第k行到第equ行.  
                // 同样,第i行一定不会是(0, 0, ..., a), a != 0的情况,这样的无解的.  
                free_x_num = 0; // 用于判断该行中的不确定的变元的个数,如果超过1个,则无法求解,它们仍然为不确定的变元.  
                for (j = 0; j < var; j++)  
                {  
                    if (a[i][j] != 0 && free_x[j]) free_x_num++, free_index = j;  
                }  
                if (free_x_num > 1) continue; // 无法求解出确定的变元.  
                // 说明就只有一个不确定的变元free_index,那么可以求解出该变元,且该变元是确定的.  
                temp = a[i][var];  
                for (j = 0; j < var; j++)  
                {  
                    if (a[i][j] != 0 && j != free_index) temp -= a[i][j] * x[j];  
                }  
                x[free_index] = temp / a[i][free_index]; // 求出该变元.  
                free_x[free_index] = 0; // 该变元是确定的.  
            }  
            return var - k; // 自由变元有var - k个.  
        }  
        // 3. 唯一解的情况: 在var * (var + 1)的增广阵中形成严格的上三角阵.  
        // 计算出Xn-1, Xn-2 ... X0.  
        //同上。如果是模二就要用方案二  
        //方案一  
        for (i = var - 1; i >= 0; i--)  
        {  
            temp = a[i][var];  
            for (j = i + 1; j < var; j++)  
            {  
                if (a[i][j] != 0) temp -= a[i][j] * x[j];  
            }  
            if (temp % a[i][i] != 0) return -2; // 说明有浮点数解,但无整数解.  
            x[i] = temp / a[i][i];  
        }  
        /*方案二 
        //唯一解,回代 
          for(int i = var-1; i >= 0;i--) 
          { 
              x[i] = a[i][var]; 
              for(int j = i+1;j < var;j++) 
                  x[i] ^= (a[i][j] && x[j]); 
          } 
          */  
        return 0;  
    }  
    int main(void)  
    {  
       freopen("in.txt", "r", stdin);  
        //freopen("out.txt","w",stdout);  
        int i, j;  
        int equ,var;  
        while (scanf("%d %d", &equ, &var) != EOF)  
        {  
            memset(a, 0, sizeof(a));  
            for (i = 0; i < equ; i++)  
            {  
                for (j = 0; j < var + 1; j++)  
                {  
                    scanf("%d", &a[i][j]);  
                }  
            }  
    //        Debug();  
            int free_num = Gauss(equ,var);  
            if (free_num == -1) printf("无解!\n");  
       else if (free_num == -2) printf("有浮点数解,无整数解!\n");  
            else if (free_num > 0)  
            {  
                printf("无穷多解! 自由变元个数为%d\n", free_num);  
                for (i = 0; i < var; i++)  
                {  
                    if (free_x[i]) printf("x%d 是不确定的\n", i + 1);  
                    else printf("x%d: %d\n", i + 1, x[i]);  
                }  
            }  
            else  
            {  
                for (i = 0; i < var; i++)  
                {  
                    printf("x%d: %d\n", i + 1, x[i]);  
                }  
            }  
            printf("\n");  
        }  
        return 0;  
    }  
     </pre><pre name="code" class="cpp">//异或版,包括求至少要按开关几下  

    const int MAXN=50;  
    int equ,var;  
    int a[MAXN][MAXN]; //增广矩阵  
    int x[MAXN]; //解集  
    int free_x[MAXN];//用来存储自由变元(多解枚举自由变元可以使用)  
    int free_num;//自由变元的个数  

    //返回值为-1表示无解,为0是唯一解,否则返回自由变元个数  
    int Gauss()  
    {  
        int max_r,col,k;  
        free_num = 0;  
        for(k = 0, col = 0 ; k < equ && col < var ; k++, col++)  
        {  
            max_r = k;  
            for(int i = k+1; i < equ; i++)  
            {  
                if(abs(a[i][col]) > abs(a[max_r][col]))  
                    max_r = i;  
            }  
            if(a[max_r][col] == 0)  
            {  
                k--;  
                free_x[free_num++] = col;//这个是自由变元  
                continue;  
            }  
            if(max_r != k)  
            {  
                for(int j = col; j < var+1; j++)  
                    swap(a[k][j],a[max_r][j]);  
            }  
            for(int i = k+1; i < equ; i++)  
            {  
                if(a[i][col] != 0)  
                {  
                    for(int j = col; j < var+1; j++)  
                        a[i][j] ^= a[k][j];  
                }  
            }  
        }  
        for(int i = k; i < equ; i++)  
            if(a[i][col] != 0)  
                return -1;//无解  
        if(k < var) return var-k;//自由变元个数  
        //唯一解,回代  
        for(int i = var-1; i >= 0; i--)  
        {  
            x[i] = a[i][var];  
            for(int j = i+1; j < var; j++)  
                x[i] ^= (a[i][j] && x[j]);  
        }  
        return 0;  
    }  
    int n;  

    const int INF = 100000;  
    int solve()  
    {  
        int t = Gauss();  
        if(t == -1)  
        {  
            return -1;  
        }  
        else if(t == 0)  
        {  
            int ans = 0;  
            for(int i = 0; i < n*n; i++)  
                ans += x[i];  
            return ans;  
        }  
        else  
        {  
            //枚举自由变元  
            int ans = INF;  
            int tot = (1<<t);  
            for(int i = 0; i < tot; i++)  
            {  
                int cnt = 0;  
                for(int j = 0; j < t; j++)  
                {  
                    if(i&(1<<j))  
                    {  
                        x[free_x[j]] = 1;  
                        cnt++;  
                    }  
                    else x[free_x[j]] = 0;  
                }  
                for(int j = var-t-1; j >= 0; j--)  
                {  
                    int idx;  
                    for(idx = j; idx < var; idx++)  
                        if(a[j][idx])  
                            break;  
                    x[idx] = a[j][var];  
                    for(int l = idx+1; l < var; l++)  
                        if(a[j][l])  
                            x[idx] ^= x[l];  
                    cnt += x[idx];  
                }  
                ans = min(ans,cnt);  
            }  
            return ans;  
        }  
    }
1 字符串处理 5 1.1 KMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2 e-KMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3 Manacher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.4 AC 自动机 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.5 后缀数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.5.1 DA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.5.2 DC3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.6 后缀自动机 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.6.1 基本函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.6.2 例题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.7 字符串 hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2 数学 25 2.1 素数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.1.1 素数筛选(判断 <MAXN 的数是否素数) . . . . . . . . . . . . . . . . 25 2.1.2 素数筛选(筛选出小于等于 MAXN 的素数) . . . . . . . . . . . . . . . 25 2.1.3 大区间素数筛选(POJ 2689) . . . . . . . . . . . . . . . . . . . . . . . 25 2.2 素数筛选和合数分解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.3 扩展欧几里得算法(求 ax+by=gcd 的解以及逆) . . . . . . . . . . . . . . . 27 2.4 求逆 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.4.1 扩展欧几里德法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.4.2 简洁写法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.4.3 利用欧拉函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.5 模线性方程组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.6 随机素数测试和大数分解 (POJ 1811) . . . . . . . . . . . . . . . . . . . . . . . 29 2.7 欧拉函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.7.1 分解质因素求欧拉函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.7.2 筛法欧拉函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.7.3 求单个数的欧拉函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.7.4 线性筛(同时得到欧拉函数和素数表) . . . . . . . . . . . . . . . . . . 32 2.8 高斯消(浮点数) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.9 FFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 2.10 高斯消法求方程组的解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.10.1 一类开关问题,对 2 取模的 01 方程组 . . . . . . . . . . . . . . . . . . . 37 2.10.2 解同余方程组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 2.11 整数拆分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.12 求 A B 的约数之和对 MOD 取模 . . . . . . . . . . . . . . . . . . . . . . . . . . 43 2.13 莫比乌斯反演 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 2.13.1 莫比乌斯函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 2.13.2 例题:BZOJ2301 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 2.14 Baby-Step Giant-Step . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.15 自适应 simpson 积分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.16 斐波那契数列取模循环节 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.17 原根 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.18 快速数论变换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.18.1 HDU4656 卷积取模 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.19 其它公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 2.19.1 Polya . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 kuangbin 1 ACM Template of kuangbin 3 数据结构 56 3.1 划分树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 3.2 RMQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.2.1 一维 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.2.2 二维 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.3 树链剖分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.3.1 点权 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.3.2 边权 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 3.4 伸展树(splay tree) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.4.1 例题:HDU1890 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.4.2 例题:HDU3726 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3.5 动态树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 3.5.1 SPOJQTREE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 3.5.2 SPOJQTREE2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.5.3 SPOJQTREE4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 3.5.4 SPOJQTREE5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 3.5.5 SPOJQTREE6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 3.5.6 SPOJQTREE7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 3.5.7 HDU4010 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 3.6 主席树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 3.6.1 查询区间多少个不同的数 . . . . . . . . . . . . . . . . . . . . . . . . . . 95 3.6.2 静态区间第 k 大 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 3.6.3 树上路径点权第 k 大 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 3.6.4 动态第 k 大 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 3.7 Treap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 3.8 KD 树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 3.8.1 HDU4347 K 近邻 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 3.8.2 CF44G . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 3.8.3 HDU4742 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 3.9 替罪羊树 (ScapeGoat Tree) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 3.9.1 CF455D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 3.10 动态 KD 树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 3.11 树套树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 3.11.1 替罪羊树套 splay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 4 图论 130 4.1 最短路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 4.1.1 Dijkstra 单源最短路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 4.1.2 Dijkstra 算法 + 堆优化 . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 4.1.3 单源最短路 bellman_ford 算法 . . . . . . . . . . . . . . . . . . . . . . . 131 4.1.4 单源最短路 SPFA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 4.2 最小生成树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 4.2.1 Prim 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 4.2.2 Kruskal 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 4.3 次小生成树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 4.4 有向图的强连通分量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 4.4.1 Tarjan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 4.4.2 Kosaraju . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 4.5 图的割点、桥和双连通分支的基本概念 . . . . . . . . . . . . . . . . . . . . . . . 138 4.6 割点与桥 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 4.6.1 模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 kuangbin 2 ACM Template of kuangbin 4.6.2 调用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 4.7 边双连通分支 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 4.8 点双连通分支 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 4.9 最小树形图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 4.10 二分图匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 4.10.1 邻接矩阵(匈牙利算法) . . . . . . . . . . . . . . . . . . . . . . . . . . 149 4.10.2 邻接表(匈牙利算法) . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 4.10.3 Hopcroft-Karp 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 4.11 二分图多重匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 4.12 二分图最大权匹配(KM 算法) . . . . . . . . . . . . . . . . . . . . . . . . . . 153 4.13 一般图匹配带花树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 4.14 一般图最大加权匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 4.15 生成树计数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 4.16 最大流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 4.16.1 SAP 邻接矩阵形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 4.16.2 SAP 邻接矩阵形式 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 4.16.3 ISAP 邻接表形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 4.16.4 ISAP+bfs 初始化 + 栈优化 . . . . . . . . . . . . . . . . . . . . . . . . . 165 4.16.5 dinic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 4.16.6 最大流判断多解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 4.17 最小费用最大流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 4.17.1 SPFA 费用流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 4.17.2 zkw 费用流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 4.18 2-SAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 4.18.1 染色法(可以得到字典序最小的解) . . . . . . . . . . . . . . . . . . . . 172 4.18.2 强连通缩点法(拓扑排序只能得到任意解) . . . . . . . . . . . . . . . . 173 4.19 曼哈顿最小生成树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 4.20 LCA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 4.20.1 dfs+ST 在线算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 4.20.2 离线 Tarjan 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 4.20.3 LCA 倍增法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 4.21 欧拉路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 4.21.1 有向图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 4.21.2 无向图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 4.21.3 混合图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 4.22 树分治 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 4.22.1 点分治 -HDU5016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 4.22.2 * 点分治 -HDU4918 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 4.22.3 链分治 -HDU5039 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 5 搜索 205 5.1 Dancing Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 5.1.1 精确覆盖 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 5.1.2 可重复覆盖 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 5.2 八数码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 5.2.1 HDU1043 反向搜索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 6 动态规划 212 6.1 最长上升子序列 O(nlogn) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 6.2 背包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 6.3 插头 DP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 kuangbin 3 ACM Template of kuangbin 6.3.1 HDU 4285 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 7 计算几何 218 7.1 二维几何 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 7.2 三维几何 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 7.3 平面最近点对 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 7.4 三维凸包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 7.4.1 HDU4273 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 8 其他 249 8.1 高精度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 8.2 完全高精度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 8.3 strtok 和 sscanf 结合输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 8.4 解决爆栈,手动加栈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 8.5 STL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 8.5.1 优先队列 priority_queue . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 8.5.2 set 和 multiset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 8.6 输入输出外挂 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 8.7 莫队算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 8.7.1 分块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 8.7.2 Manhattan MST 的 dfs 顺序求解 . . . . . . . . . . . . . . . . . . . . . . 260 8.8 VIM 配置 .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值