暑期【M_】

——我用了两年的时间【现在弟弟也是我这个专业】【我男神用高一那年搞了很多文章】

我是想稍微提升下。

 LCA 最近公共祖先 (笔记、模板)_

二分图匹配模板

【模板】最大流模板(dinic)

 [luogu 2324][SCOI 2005] 骑士精神 (A*算法)_

有断点。。。

P3369 【模板】普通平衡树 (splay 模板)

【模板】manacher算法【没懂、kmp比这个算法强大】

废话别多说了、多年后看指定xxxx呢。

【并查集】不是很懂

int find(int x)                                                                                                         //查找根节点
{
    if (fa[x] == x) return x;
    return fa[x] = find(fa[x]);
}

void join(int a, int b) {
    int x = find(a);
    int y = find(b);
    if (x != y) fa[x] = y;
}

【最小生成树        kaluskal?】

//洛谷1546——转载
#include<cstdio>
#include<algorithm>
using namespace std;
int n, cnt, sum, ans;
int fa[105];

struct edg {
    int from, to, dis;
}edge[10005];

bool cmp(edg x, edg y) {
    return x.dis < y.dis;
}

int find(int x)                                                                                                         //查找根节点
{
    if (fa[x] == x) return x;
    return fa[x] = find(fa[x]);
}

void join(int a, int b) {
    int x = find(a);
    int y = find(b);
    if (x != y) fa[x] = y;
}

int main() {
    scanf_s("%d", &n);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++) {
            int x;
            scanf_s("%d", &x);
            if (i != j) {
                cnt++;
                edge[cnt].dis = x;
                edge[cnt].from = i, edge[cnt].to = j;
            }
        }
    for (int i = 1; i <= n; i++) fa[i] = i;
    sort(edge + 1, edge + cnt + 1, cmp);
    for (int i = 1; i <= cnt; i++) {
        if (find(edge[i].from) != find(edge[i].to)) {
            join(edge[i].from, edge[i].to);
            sum += edge[i].dis;
            ans++;
        }
        if (ans == n - 1) break;
    }
    printf("%d", sum);
    return 0;
}

高精

类和struct的运算符重载{四则运算}

并利用数组进行储存与处理,通过模拟四则运算,可以计算很大的整数的加减乘除比大小。

支持负数,前导零        存储最强的unsigned long long。

一些小问题:

堆模板、榨取somebody(时间和金钱)

题目都没办法看懂——

拓扑排序【有向无环图-AOV网、偏序-全序【任意两个点之间都有先后顺序】】···烦人的幻灯片···

整数划分_

洛谷 P1508 Likecloud-吃、吃、吃_

f(n) mod 1000000007 【矩阵快速幂模板】【矩阵乘法+快速幂】

一般矩阵快速幂的题都要取模的:【快速幂就行吧】

斐波那契写的太骚了。【a.da[1][1]和a.da[1][2]就是所求f(n)和f(n+1)】

快速幂取模得以实现,基础是(a * b) % c = ((a % c) * (b % c)) % c,此处证明“度娘” 】

for (int k = 1; k <= m; k++)
    c.da[i][j] += (da[i][k] % MOD * b.da[k][j] % MOD) % MOD, c.da[i][j] %= MOD;//不懂。。

 终极优化:

long long fastPower(long long base, long long power) {//转载
    long long result = 1;
    while (power > 0) {
        if (power & 1) {//此处等价于if(power%2==1)【power为奇数】
            result = result * base % 1000;
        }
        power >>= 1;//此处等价于power=power/2
        base = (base * base) % 1000;
    }
    return result;
}
  1. #define F(i,a,b) for(register int i=(a);i<=(b);i++)【寄存器】牛

二分图

        【二部图?感觉很像】【将点分类、A类中没有边相连;A类和B类之间是相连的】

        染色法【判断一个图≠二分图?】

        匈牙利算法【求二分图的最大匹配数】

网络流问题【源-汇】也是最大流问题?

lca【最近公共祖先】的方法大体有三种:
1.dfs+RMQ(线段树 ST表什么的) 在线
2.倍增 在线
3.tarjan 离线【一个例子算法详解之最近公共祖先(LCA) - hulean - 博客园 (cnblogs.com)

        思路:{递归、dfs遍历查询到“树的末”。遍历“查询”、没有直接返回;没visit也暂时返回。有visit返回并查集find的结果。}...

乱来。。。

    //小问题
	cout << (1 << 3|1);//位运算
	cout <<endl<< 1e5;//小数点“移动就行”

简单了解

ST表d[i][j]=1<<j等同2^j

线段树【KD树】

主席树【投机取巧、新生成的结点连接上未改变的结点】

splay相似AVL

替罪羊树、暴力拍平【less is more】

区间询问Q        倍增法求lca

位运算

memset逐字节赋值、{char【一个字节除外】、int占4个字节=16843009}对结构体、大的数组赋值效率高

        赋成0或者-1没问题

    int a[4] = { 0,0,0,0 };
    memset(a, -1, sizeof(int) * 4);//可以考虑一下

4、Markdown语法
纯文本格式的标记语言
**初步学习**【https://www.jianshu.com/p/191d1e21f7ed】
换行——HTML 的 <br> 标签/‘ ’‘ ’‘回车’【官方教程-在线编辑器】
、、、写微信公众号······

OVER

高斯消元【线性方程组;手算思路差不多】【有一个题、没思路要用到“高斯消元”。、行列式..】

    for (int i = 1; i <= n; i++) {//log以2为底、log3=2;向上取整
        lg[i] = lg[i - 1];
        if (1 << lg[i - 1] + 1 == i) lg[i]++;
        //lg[i]=((i & (i-1))==0) ? lg[i-1]+1 : lg[i-1];
    }

 代码好多看不懂、看懂一部分就不错orz..

用途:

分块是一种基于暴力的解决 在线区间查询 和 区间修改 等常见  区间操作  的算法,可以说是一种优雅”的暴力,而且莫队等其他算法也是在这个算法的基础上进行的改进

manacher给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度

        中间插隔着不同原来的字符。【abaaba】=6;

【初等数论】

组合数【找规律or公式Cn^m=Cn-1^m+Cn-1^m-1】

5÷2=6?——是的,模7意义下

中国剩余定理【古书上的小例子】【模x余y;模a余b;模m余n;所以此数是?】

        5*7模3的逆【是2】

求最大公约数

        gcd【“辗转相除法”-“欧几里得算法”】扩展的欧几里得算法exgcd【最小公倍数】   质因数分解、短除法、“更相减损法”【较慢、但俺认为减法相对除法计算机效率更高】

递归版:【转】

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

非递归版:【转】

int gcd(int a,int b){
    int x=a;
    int y=b;
    while(y){//即使是x比较小也没问题。c=x;x=y;y=x;就交换了。下一次while x就是比较大的那个数了
        int c=x%y;
        x=y;
        y=c;
    }
    return x;
}

Exgcd【转证明】

一定存在一组使得一定存在一组x,y使得:ax+by=gcd(a,b) (x,y≥0).

这个东西还比较好证,主要就是归纳法;如下:

当 a=b 时, x=1,y=0 ,有解。

(其实 a>b 的情况可以等价表示为 a<b 的情况(交换一下两个数),此处仅考虑 a<b 的情况。)

∵a<b

∴a%b<b

∴gcd(a,b)=gcd(b,a%b)

∴ 只需证 bx+(a%b)y=gcd(b,a%b) ,则可证 ax+by=gcd(a,b).

形式化的, a%b 可以表示为: a−⌊ab⌋ b.

所以:

bx+(a%b)y

= bx+(a−⌊ab⌋ b)y

= bx+ay−(⌊ab⌋b)y

= ay+b(x−⌊ab⌋y) .

则可以发现当设 x1=y,y1=x−⌊ab⌋y 时, x1,y1 符合解的要求。

这个过程可以用递归实现,代码如下:【没看】

void exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return;
    }
    int x1,y1;
    exgcd(b,a%b,x1,y1);
    x=y1;
    y=x1-(a/b)*y1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值