寒假集训知识点总结

一.万能头文件

#include<bits/stdc++.h>

二.二维数组

格式:类型说明 数组名[常量表达式1][常量表达式2]
要求:a[3][4]表示二维数组有三行四列,定义时,可以省略第一维的大小,不能省略第二维。
初始化
按行分段赋值 如 int a[2][2]={ {1,2}, {3,4} };
按行连续赋值 如 int a[2][2]={1,2,3,4}
只对部分赋值,其他自动赋0 如 a[3][3]={ {1},{2},{3} };
赋值结果是1 0 0 //2 0 0 //3 0 0
遍历

int a[m][n];
for(i=0;i<m;i++)
	for(j=0;j<n;j++)

三.结构体

定义:用于储存和处理大批量相同数据类型或不同数据类型的数据。
格式:先声明

struct 类型名 node
{
    数据类型1   成员名1;    int x;
    数据类型2   成员名2;    string  y;
    ...
}变量名p[100];(注意分号)

使用
对结构体整体进行操作 例如swap(p[1],p[2])
对结构体成员进行操作 例如`z=p[1].x+p[2].x;

四.sort排序

说明

1.sort是c++自带函数
2.复杂度n*log(n)
格式
.函数有三个参数sort(起始地址,结束地址,排序方法)
排序方法可以不写,默认从小到大。
sort(a,a+n) (i从0开始)
sort(a+1,a+n+1)(i从1开始)
排序方法
从小到大 sort(a,a+n,less<数据类型>())
从大到小sort(a,a+n,greater<数据类型>())

五.cmp函数的写法

bool cmp1(node a,node b)结构体按x从大到小排序
{
   return a.x>b.x;
}
bool cmp(int a,int b)  a,b按从小到大排序
{
   return a<b;
}
要求a数组按x从小到大排序,若x相等,按y从小到大排
struct node
{
int x,y;
}a[10];
bool cmp(node a,node b)
{
   if(a.x==b.x)
   return a.y<b.y;
   else  return a.x<b.x;
 }

六.桶排序

记录x出现的次数,记得使用完桶排序后清空
for(i=1;i<=n;i++)
{
  cin>>x;
  a[x]++;
}

七.二进制枚举

算数位运算
1.与(&)只有1与1才是1,(同数学)
A=60 ( 0011 1100)
B=13 ( 0000 1101)
A&B=12(0000 1100)
2.或(|)只有0或0才是0
A=60 ( 0011 1100)
B=13 ( 0000 1101)
A|B=61( 0011 1101)
3.非 按位取反(~)
A = 60 ( 0011 1100)
~A=195(1100 0011)
4.异或运算^
运算法则相当于不带进位的二进制加法。
对于异或一个非常重要的性质,对于一个值异或同一个值两次,则结果还是原值。
A=60 ( 0011 1100)
B=13 ( 0000 1101)
A^B=49(0011 0001)
二进制移位操作符
1.左移<<
相当于乘2
2.右移>>
相当于除2
二进制枚举
二进制枚举利用的是二进制下n位长度的数有2^n个,0表示不取,1表示取

for(i=0;i<(1<<n);i++)
{
	for (int j=0;j<n;j++)
	{
		if(i&(1<<j))
		{
			...
    	}
}

八.最大公约数和最小公倍数

最大公约数
直接使用__gcd( )函数
1.辗转相除法

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

2.更相减损术.(两数相差较大时不适用,且对0和负数要特判)

int gcd(int a,int b)
{
	if(x==y)
	return x;
	return x>y?gcd(x-y,y):gcd(y-x,x);

最小公倍数
lcm(a,b)=a * b / gcd(a,b)
防止a*b溢出一般写为lcm(a,b)=(a/gcd(a,b) * b)
多个数的最大公约数和最小公倍数

int work (int a[],int n)
{
	int ans=a[0];
	for(int i=1;i<n;i++)
	ans=gcd(ans,a[i])

九.快速幂取模

a^b%c

ll quickmod(ll a,ll b,ll c)
{
	int ret=1;
	while(b)
	{
		if(b&1)
		ret=ret*a%c;
		a=a*a%c;
		b/=2;
	}
	return ret;
}

十.二分查找

原理可回忆数学上的二分法求零点。

double seek(double l,double r,double k)
{
	double m=r+(l-r)/2;      //防止l+r爆数据类型上限
	while(r-l>=1e6)          //终止条件依据题目条件
	{
		if(f(m)>cmp)
			r=m;
		else l=m;
		m=l+(r-l)/2;
	}
	return m;
}
		

十一.栈

定义:利用一组地址连续的存储单元依次 自栈底到栈顶 存放 栈的数据元素。
栈的基本操作
1.初始化栈 stack<int数据类型>vis;
2.入栈 vis.push(x)
3.出栈 vis.pop();//括号里不写;出栈只能一个一个出
4.判断是否为空 vis.empty();
5.判断栈中元素的数量 vis.size();
6.得到栈顶元素 vis.top();
出栈
由于先进后出,出栈时顺序是反的

while(!s1.empty())
{
	s2.push(s1.top());
	s1.pop();
}
while(!s2.empty())
{
	printf("%c",s2.pop());
	s2.pop();
}

十二.队列

定义:队列就是允许在队尾一端插入,在队首一端进行删除的线性表。
队列的基本操作
1.初始化 queuevis;
2.入队 vis.push( x );
3.出队 vis.pop( );
4.判断是否为空 vis.empty();
5.判断队列中元素的数量 vis.size();
6.得到队首元素 vis.front();

十三.优先队列

定义:`priority_queue<类型>name; 常用于处理贪心问题。

排列
从小到大 priority_queue<int,vector<int>,greater<int> >vis
从大到小priority_queue<int,vector<int>,less<int> >vis
基本操作
队首元素 vis.top()与队列区分清楚
出队 vis.pop()
例子

struct sa
{
	int x,y,sum;
};
bool operator<(const sa &a,const sa &b)
{
	return a.sum>b.sum;//从小到大!
}
priorit_queue<sa>vis;

十四.素数筛

const int N=1e7+1;
int p[N],b[N],cnt=0,max1=1e7;
int init()
{
	memset (b,1,sizeof(b));
	b[0]=b[1]=0;
	for(int i=2;i<=max1;i++)
	{
		if(b[i])
		p[++cnt]=i;
		for(int j=1;j<=cnt&&p[j]*i<=max1;j++)
		{
			b[p[j]*i]=0;
			if(i%p[j]==0)
			break;
		}
	}
	return 0;
}

唯一分解定理


void get(long long nn)
{
    int cas=0;
    for(int i=0;i<len&&p[i]*p[i]<=nn;i++)
    {
        while(nn%p[i]==0)
        {
            factor[cas]++;//每个素因子的幂
            nn/=p[i];
        }
        if(factor[cas])
        cas++;//素因子个数
    }
    if(nn>1)
    factor[cas]=1;
}

求因子和

ll f(ll x)
{
    ll s=1;
    for(ll i=1;prime[i]*prime[i]<=x;i++)
    {
        if(x%prime[i]==0)
        {
            ll t=1;
            while(x%prime[i]==0)
                t=t*prime[i],x=x/prime[i];
            s*=(t*prime[i]-1)/(prime[i]-1);
        }
    }
    if(x>1)s*=(1+x);
    return s;
}

十五.map映射

定义
数组即是一种映射,map可以将任何基本数据类型映射到任何数据类型
自动升序排列
map<typename1,typename2>name
常用情况
1.需要建立字符(串)与整数之间的映射;
2.判断大整数或者其他类型数据是否存在,桶排序;
3.字符串与字符串之间的映射。
访问方式
1.直接通过下标访问,类似于数组;
2.通过迭代器访问

map<typename1,typename2>iterator it;
for(it=vis.begin;it!=vis.end;it++)//正向
{
	cout<<*it<<" ";
}
map<typename1,typename2>reverse it;
for(it=vis.rbegin;it!=vis.rend;it++)//反向
{
	cout<<*it<<" ";
}

end返回的不是指向最后一个元素的迭代器,而是指向最后一个元素后面位置的迭代器。
rend返回的是指向容器中第一个元素前面元素位置的迭代器。
map的常用函数
1.插入vis.insert()
2.查找vis.find()或vis.count()
3.删除vis.erase(key)或vis.erase(first,last)左闭右开
4.清空vis.clear()
pair
pair有两个参数,分别对应first和second的数据类型,可以是任意基本数据类型或者容器。相当于只有两个元素的一个结构体。

pair<typename1,typename2>name;

十六.set集合

定义
是一个内部自动有序且不含重复元素的容器。自动去重,升序排序
set < typename >name;
常用函数同map所列
lower_bound(key_value)返回第一个大于等于key_value的定位器
upper_bound(key_value)返回最后一个大于等于key_value的定位器
访问方式
set只能通过迭代器访问。

十七.vector向量

定义
长度根据需要自动变长的数组,type可以是任何基本类型 。
vector < typename >name;
访问方式
1.下标
2.迭代器
常用函数
1.vis.push_back()在vector后面添加一个元素;
2.vis.size()获得vector中元素的个数;
3.vis.pop_back()删除vector的尾元素;
4.vis.clear();
5.vis.insert(it,x)向vector任意迭代器it处插入一个元素x;
6.vis.erase();

十八.string字符串

访问方式
1.下标访问;
2.迭代器访问
string::iterator it;
运算
1.可以进行加法运算连接两个字符串;
2.进行比较 >< 按照字典序比较两个string类型的大小,不是比长度;
常用函数
1.length()和size()用来返回string的长度;
2.clear()清空所有元素;
3.substr(pos,len)返回从pos位置开始,长度为len的子串;
4. insert(pos,string)在pos位置插入string;
insert(it,it2,it3)it欲插入位置,it2与it3是待插入字符串的首尾迭代器;(左闭右开)
5. erase(it)删除单个元素;
erase(first,last)迭代器;
erase(pos,length)pos是要删除的起始位置,length要删除的长度;
6. str.find(str2)当str2是str的子串时,返回其在str中第一次出现的位置否则返回string::npos。
str.find(str2,pos)从pos位置开始匹配str2,返回值同上。
7.replace(pos,len,str2)把str从pos位开始,长度为len的子串替换为str2
或者replace(it1,it2,str2)表示it1~it2范围内的子串替换为str2.

十九.其他

max( )最大值,min( )最小值,abs( )绝对值,swap( )交换
1.最大/小值函数只有两个参数,求三个数时max(a,max(b,c))。
2.abs()参数必须是整数,如果是浮点数用math头文件中的fabs()。
reverse
reverse(it,it2)将it~it2之间的元素反转(左闭右开)
next_permutation( )
求一个序列在全排列中的下一个序列。

int a[10]={1,2,3};
do
{
	cout<<a[0]<<a[1]<<a[2]<<endl;
}while(next_permutation(a,a+3);
输出123,132,213,231,312,321.

fill()和memset()
memset只能赋值0和-1,赋值1的话,值为正整数。
fill()可以是范围内任何值。

发布了9 篇原创文章 · 获赞 0 · 访问量 224

猜你喜欢

转载自blog.csdn.net/zmsjylyf/article/details/104427864
今日推荐