——我用了两年的时间【现在弟弟也是我这个专业】【我男神用高一那年搞了很多文章】
我是想稍微提升下。
[luogu 2324][SCOI 2005] 骑士精神 (A*算法)_
有断点。。。
【模板】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网、偏序-全序【任意两个点之间都有先后顺序】】···烦人的幻灯片···
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;
}
-
#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;
}