前缀和
前缀和概念前缀和指的是用另一个数组b[n]来保存a[n]中前n项的和
例如,b[0]=a[0],b[1]=a[0]+a[1],…
应用求数组某一区间长度数字的和如果我给你一串长度为n的数列a1,a2,a3……an,再给出m个询问,每次询问给出L,R两个数,要求给出区间[L,R]里的数的和,一般可能是从L到R遍历一次,但这样很花时间,有了前缀和之后可以直接b[R]-b[L]就得到L到R的和
差分差分就是将数列中的每一项分别与前一项数做差
一个序列1 2 5 4 7 3,差分后得到1 1 3 -1 3 -4 -3
这里注意得到的差分序列第一个数和原来的第一个数一样(相当于第一个数减0)差分序列最后比原序列多一个数(相当于0减最后一个数)
例 给你一串长度为n的数列a1,a2,a3……an,要求对a[L]~a[R]进行m次操作:
操作一:将a[L]~a[R]内的元素都加上P
操作二:将a[L]~a[R]内的元素都减去P
最后再给出一个询问求a[L]-a[R]内的元素之和?
如果用一般做法就是遍历加减,时间复杂度高,现在可以直接让b[L] 加上P,再让b[R+1]减去P,这样因为b[L+1]= ...
初始化文件
有两个初始化文件,第一个文件是在启动时执行的,叫做登录文件(login file).第二个文件是在启动shell时执行的,叫做环境文件(environment file)。有的shell还有注销文件,注销文件指的是在shell关闭时执行的文件
bash shell中登录文件文件名(.Bash_profile .bash_login),环境文件(.bashrc),注销文件(.bash_logout)
这些文件名都是以点开头,点文件的别名是隐藏文件,意义是除非你用ls指令去查看,通常状况你无法看到这个文件
登录shell指的是登录时默认启动的shell,非登录shel则需要在登录shell中执行命令才可以启动
登录shell执行登录文件和环境文件,非登录shell只执行环境文件
初始化文件中放什么内容登录文件有两项任务,设置环境和初始化工作对话(不知道什么意思)
所以登录文件有两项任务
创建或修改环境变量的命令(PATH,PAGER等)
执行所有一次性操作的命令
内中断
一般cpu都有一种能力,就是接受cpu内部或外部发来的信号,停止当前程序而取执行其他的程序。这种信息叫做中断信息,中断信息指的是cpu接受到这种信息后立刻处理这个信息。接受到这个信息后cpu会交给专门的程序去处理,叫做中断处理程序
内中断内中断指的是中断信息来自cpu内部。当cpu接受到相应几种情况时,会产生相应的中断信息
除法错误 例如 ,div除法溢出
单步执行
执行into指令
执行int 指令
我们先不需要了解具体含义。为了更方便的知道到底属于那种中断信息,8086cpu用了一个字节的中断类型码来确定。
除法错误 0
单步执行 1
执行into指令 4
int: int n ,n就是中断类型码
cpu根据cs:ip知道程序的入口,所以中断类型码中必定有cs:ip的信息,可cpu如何根据8位的类型吗知道程序的入口呢?
中断向量表cpu通过中断类型码找到中断向量表,而中断向量表中就保存着程序的入口。中断向量表在内存中保存。中断内存表位于0000:0000 到 0000:03ff 1024个字节中
中断过程找到cs:ip的过程叫做中断过程。
cpu收到中断信息后,要对中断信息 ...
从asm到exe
先要有masm.exe和link.exe,然后输入masm+程序名和link+程序名
或者masm+盘符+程序名,可以省略中间过程,节省时间例:masm c:\1.asm
二叉树链表构建和应用
递归遍历中序void inorder(binarytree *T){ if(T != NULL) { inorder(T->left); cout << T->data << endl; inorder(T->right); }}前序void preorder(binarytree *T){ if(T != NULL) { cout << T->data << endl; preorder(T->left); preorder(T->right); }}后序遍历同理。
这个算法是以当前节点为基点,先输出当前节点数值,然后再去输出左子树数值,然后再递归输出左子树数值知道NULL,才又递归输出右子树数值。
应用二叉树构建如果我们只给出数值和构建顺序,是无法构建二叉树的。例如,给出三个数,然后给出构建顺序是12 ...
&&与||小提示
&&&&运算符从左自由依次判断 ,如果判断有一个为假则停止判断
||同理如果判断有一个为真则停止判断
例#include<iostream>
using namespace std;
int main()
{
int a=0,b=1,c;
c = (a != b) || (++a == b++);
cout<<a<<" "<<b<<endl;
return 0;
}
输出为0 1因为前面一个为真,直接退出判断
“凸包”
凸包就是把平面中所有点都包进去的凸多边形,当然多边形上的点也是题目中给出的点
分治法 1 首先,横坐标最小p1和最大pn的点一定是凸包上的点 2上包,即离p1pn最远的点,记pmax 3再把pmax与p1连接,求左侧的上包,重复上述过程即可求解
string大小写字母转换
在algorithm库中有transform函数transform(str.begin(),str.end(),str.begin(),::toupper)注意transform有四个输入参数1:str.begin()字符串的起始地址;2:str.end()字符串的终止地址;3:str.begin()是转换之后,输出到原str字符串的起始地址;4:转换操作,可以选择toupper,tolower。
vector
vector的定义vector<数据类型> 标识符
vector的函数begin()返回开头元素的迭代器
end()同理
front() 返回开头元素的引用
back() 返回末尾元素的引用
size()返回vector内元素的数量
erase(迭代器) 删除一个元素
clear() 清空
insert(迭代器,a) 把a插入迭代器后
例vector中现在有1 2 3 三个元素,vec.insert(vec.begin()+2,4)得到1 2 4 3
算法reverse(vec.begin(),vec.end()) (头文件<algorithm>)
实际上不一定是begin到end,也可以begin()+1到、、、,只需要用迭代器就行了
sort排序,也要用<algorithm>默认升序bool Comp(const int &a,const int &b){ return a>b;}调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。
二维数组vector< ...
unix文件系统
文件就是任意源,有一个名称,可以从中写入读出数据。
文件类型unix中有三种文件类型,普通文件,目录和伪文件。
普通文件是大多数时候所使用的文件,包括文本文件和二进制文件。例如,纯文本,shell脚本,源程序,配置文件,html文件等。
目录不同之处在于他们用来组织,访问其他文件。从概念上讲,目录包含其他文件。这个文件其实类似于windows下的文件夹。
伪文件有时候也称为设备文件。这种文件是物理设备的内部表示。例如键盘,显示器,打印机等,这些设备都可以当成一个文件进行访问。
有一种特殊的伪文件时proc文件,这种文件可以访问linux内核中的信息,设置可以修改Linux内核中的数据。
特殊文件特殊文件就是表示物理设备的伪文件。这些文件都被存放于/dev下
一些常见的设备如下
位置
硬件
/dev/sda
SCSI硬盘
/dev/sda
第一分区
/dev/hda
硬盘
/dev/Ip0
打印机
/dev/tty
当前终端
/dev/random
随机数生成器
/dev/null
放弃输入 输入不返回内容
/dev/zero
放弃送站,输入返 ...