我在电脑上敲了一遍,又在纸上模拟了一遍
下面记录在电脑上敲的:
一、用数组实现栈
#include <stdio.h>
#include <string.h>
#define MaxSize 50
typedef struct{
int data[MaxSize]
最小生成树
Prim算法
朴素版Prim O(n^2)稠密图
步骤:
S:表示最小生成树的集合
初始化距离
找距离集合S最近的节点
将节点加入集合S
用该节点更新非S点到集合S点的距离
代码:const int N = 510;
const int INF = 0x3f3f3f3f;
in
「观前提醒」
「文章仅供学习和参考,如有问题请在评论区提出」
目录引入Atlantis 问题(矩形面积问题)P5490 【模板】扫描线 - 洛谷 二维数点P2163 园丁的烦恼 - 洛谷Pair Sum and Perfect Square参考资料
一些扫描线问题的整理。
引入
扫描线一般
欧拉函数
互质:对于 $forall a, b in mathbb{N} $, 若 (a, b) 的最大公因数为 (1) , 则称 (a, b) 互质。
欧拉函数:即 $ varphi (N)$, 表示从 (1) 到 (N) 中与 (N) 互质的数的个数。
在算术基本定理中, 任何一个大于 (1
Nim游戏
给定 (n) 堆石子,第 (i) 堆石子有 (A_i) 个石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。
若两人均为巨佬,采用最优策略,先手是否必胜。
这种游戏被称作Nim博弈。游戏过程中面临的状态叫做局面
1.io优化
const char endl = 'n';
//另外,请使用'n'而不是 endl ,因为endl默认会增加刷新操作,而导致输出缓冲失效,降低效率。
cin.tie(0);
ios::sync_with_stdio(false);
cin.tie(0) 和 ios::sync_
洛谷 P3304 [SDOI2013] 直径 题解
题目链接
题目分析
第一部分好说,求直径,dfs或者DP都可以。
第二部分,有一个定理,就是所有直径中点重叠。
那么有两种情况
一种是中点在一个节点上,那么显然这个点是每条直径的终点,也就是说直径的一半相等。从这个点出发dfs,找出所有最远点。
P1336 最佳课题选择 题解
题目链接
题目分析
状态:考虑 (f_{i,j}) 表示前 (i) 种论文里面,一共写了 (j) 篇,的最少花费时间。
转移策略:我们一次考虑每一种论文写多少篇。假设写 (k) 篇,(k in [0,j] cap mathbb{Z}) ,有转移方程:
[f_{i,j
一、问题描述:
高精度算法是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算
一、数组实现二叉树(下标从0开始)
#include <stdio.h>
typedef struct _TreeNode{
int data;
bool IsEmpty; //结点是否为空 // 因为我们的二叉树不一定是满二叉树,中间可能有一些节点不存
数论
质数
在大于1的整数中,只包含1和本身这两个约数,就被称为质数,也叫素数
质数的判定
试除法
遍历2-n,若有约数则不为质数 O(n)
优化:
d整除n,则n/d也整除n,约数总是成对出现,只要找较小的约数,即取d <= n/d,则d <= sqrt(n) 只用遍历2-s
基本概念
双向链表概念和单向链表是一致的,区别在于双向链表在单向链表的基础上,指针区域多了一个指向上一个节点的指针。单向链表内容可以参考我的上一篇文章:http://t.csdn.cn/Iu56H。
基本的数据结构如图所示:
链表结构
双向链表结构包含了节点的数据内容和两个指针:指向前一个节点的p
CodeForces CF1846G 题解
CodeForces题目链接
洛谷题目链接
标准答案是状压之后,转化成Dijkstra算法跑最短路。我这里提供一个不一样的思路。
题意简述
主人公得了病,有部分类型的症状。所有类型症状共有 (n) 种,用长为 (n) 的01串表示是否有那种症
欧拉函数
欧拉函数(varphi(N)) : 1-N中与N互质的数的个数
若(N = p_1^{a_1} · p_2^{a_2} · p_3^{a_3} ··· ·p_n^{a_n}) 其中p为N的所有质因子
则(varphi(N) = N(1-frac{1}{p_1})(1-frac{1}{p
和atcoder一起出交互题是吧。
D题回复逆序对个数,对于[L,R-1]和[L,R],如果R是最大值,那么对逆序对个数无影响。这样来确认某个数是不是最大的,然后递归扩展到整个区间
这里看到逆序对,要想到归并排序、分治、递归、区间合并。。。。。
查看代码
// Problem: D. More W
数据结构起源
早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。
可现实中,我们更多的不是解决数值计算的问题,而是需要一些更科学有效的手段(比如表
题目链接
给定一个n个元素有序的(升序)整型数组nums和一个目标值target, 写一个函数搜索nums中的target, 如果目标值存在返回下标, 否则返回-1。
示例 1:
输入: nums = [-1, 0, 3, 5, 9, 12], target = 9
输出: 4
解释: 9 出现在
高斯消元
求解含有n个未知数,n个方程的多元线性方程组 O(n^3)
初等行变换:
某行乘以一个非零数
交换两行
某行加上另一行的若干倍
利用初等行变换将方程组化为上三角矩阵
解的情况:
完美阶梯型:唯一解
非完美阶梯型:
0 == 非0:无解
0 == 0:无穷解
步骤:
枚举每一列
LeetCode 704 二分查找
1.左闭右开
1 public int search(int[] nums, int target) {
2 int left = 0;
3 int right = nums.length;
4
5
在.NET中,理解对象的内存布局是非常重要的,这将帮助我们更好地理解.NET的运行机制和优化代码,本文将介绍.NET中的对象内存布局。
.NET中的数据类型主要分为两类,值类型和引用类型。值类型包括了基本类型(如int、bool、double、char等)、枚举类型(enum)、结构体类型(str