一.栈,队列,Stacks,Queues
(一)栈
栈是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。元素遵循先进后出的原则。
#include <iostream>
using namespace std;
const int N=110;
int st[N];
int bottom=0,top=-1;
int n;
int main()
{
cin>>n;
while(n--)
{
cin>>st[++top];
}
while(top>=bottom)
{
cout<<st[top--]<<" ";
}
return 0;
}
(二)队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。元素遵循先进先出的原则。
#include <iostream>
using namespace std;
const int N=110;
int st[N];
int front=0,rear=-1;
int n;
int main()
{
cin>>n;
while(n--)
{
cin>>st[++rear];
}
while(rear>=front)
{
cout<<st[front++]<<" ";
}
return 0;
}
(三)Stacks
1.empty() 堆栈为空则返回真
2.pop() 移除栈顶元素
3.push() 在栈顶增加元素
4.size() 返回栈中元素数目
5.top() 返回栈顶元素
(四)Queue
1.back() 返回最后一个元素
2.empty() 如果队列空则返回真
3.front() 返回第一个元素
4.pop() 删除第一个元素
5.push() 在末尾加入一个元素
6.size()返回队列中元素的个数
二.二分
1.整数二分
整数二分有两个模板:
(1)分为[l,mid] [mid+1,r] 此时的代码为:
#include <iostream>
using namespace std;
int main()
{
int l=0,r=9,mid,a[101],x;
cin>>x;
for(int i=1;i<=r;i++)
{
cin>>a[i];
}
while(l<r)
{
mid=(l+r)/2;
if(x<=a[mid])
{
r=mid;
}
else
{
l=mid+1;
}
}
cout<<r<<endl;
return 0;
}
2.分为[l,mid-1] [mid.r]此时代码为:
#include <iostream>
using namespace std;
int main()
{
int l=0,r=9,mid,a[101],x;
cin>>x;
for(int i=1;i<=r;i++)
{
cin>>a[i];
}
while(l<r)
{
mid=(l+r+1)/2;//为了防止程序陷入死循环
if(x>=a[mid])
{
l=mid;
}
else
{
r=mid-1;
}
}
cout<<l<<endl;
return 0;
}
2.小数二分
小数二分与整数二分的差别在于while循环的限制条件不同,实数要用一个特别小的数来表示两者接近,例如1e-8;
三.前缀与差分
(1)一维前缀和
S[i] = a[1] + a[2] + … a[i]
a[l] + … + a[r] = S[r] - S[l - 1]
(2)二维前缀和
S[i, j] = 第i行j列格子左上部分所有元素的和以(x1, y1)为左上角,(x2,y2)为右下角的子矩阵的和为 S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1- 1, y1 - 1]
(3)一维差分
B[i] = a[i] -a[i-1]给区间[l,r]中的每个数加上c:B[l] += c, B[r + 1] -= c
(4)二维差分
给以(x1, y1)为左上角,(x2,y2)为右下角的子矩阵中的所有元素加上c: S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c
四.位运算
四个运算符
与&,只有x,y都是1的时候,运算结果才是1.其余情况都是0。1&1 = 1,
1&0 = 0;
或|,x,y中只要有一个是1,结果就是1,其余情况0,1|0=1, 0|0=0;
非!, 如果x是0,!x= 1,x是1的话,运算结果是0;
异或^ ,x^y相同是0,不同是1,1 ^ 1 = 0 ,0 ^ 0 = 0, 0 ^ 1 =0;
整型:有符号整型和无符号整型
int 32位二进制
有符号整型:正数: 0负数:1
1:0000000000…01
-1:1000000000…01
100000…111
反码: 011111… 000
补码: 1:如果是正数:正数的补码就等 于原码。100000…111
2:如果是负数:负数的补码就是在反码的基础上加1: 011111… 000 +1=011111… 001
左移: 1<<x 01 10 100 1 2 4 相当于扩大2的倍数。
右移: 1>>x 100 10 01 4 2 1 相当于除以2。