基础知识和c++stl库
基础知识
竞赛常用语言—C++
- 绝大部分情况下用C++(效率高、code速度快),少数情况用Java(有大数)、Python(兼容度不高)
- 输入输出:
cin cout
- 万能头文件
#include<bits/stdc++.h>
- 数组尽量放全局
- 数组尽量开大
时间(空间)复杂度
1.时间复杂度:又称时间复杂性,用来描述程序运行时间与输入数据规模的函数关系
2.算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
3.时间复杂度只保留最高项,忽略常数
O(2n2+5n+10)=O(n^2)
O(2n+n100+5)=O(2^n)
O(3n+logn)=O(n)
O(1000)=O(1)
4.常见算法的复杂度O(n) O(n2) O(nlogn) O(2^n)
5.一秒钟可以执行多少次运算? 约8e8
各个复杂度的算法中,n可以取多大?
1G内存可以开多大数组?
int 2e8
256MB 5e7
STL
STL:C++标准模板库(Standard Template Library)
STL:容器
string 动态长度字符串
- 构造函数
string s1="1234"
- 迭代器:
string::iterator it=s1.begin()
- 常用函数:clear() length() push_back() append() find() erase()
vector 动态数组,内存连续
- 构造函数:
vector<int>v1;vector<string>v2("1234"); vecotr<int>v3(5,2);vector<int>v4(v3);
- 常用函数:push_back() pop_back() front() back() insert() erase() size()
- 可以随机访问 访问O(1) 删除O(n)
queue 队列,先进先出(FIFO) 打印机、排队队伍
- 构造函数
vector<int>v1;vector<string>v2("1234"); vecotr<int>v3(5,2);vector<int>v4(v3);
- 常用函数:push() pop() front() back() size() empty()
stack 堆栈,先进后出(FILO)
- 构造函数
stack<int>st;
- 常用函数:push() pop() top() size() empty()
set 集合,元素有序排列、不重复
- 构造函数:
set<int>se
- 常用函数:insert() erase() find() size() clear() count()
lower_bound(x):大于等于x的第一个元素位置,不存在返回end()
upper_bound(x):大于x的第一个元素位置,不存在返回end() - 查询、插入、删除O(logn)
map 字典,key-value键值对,按key有序排列
- 构造函数:
map<int,int>mp
- 常用函数:erase() find() size() clear() count() lower_bound() upper_bound()
- 可以像数组一样通过[]访问
- 插入、删除O(logn)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t,n;
cin>>t;
while (t--)
{
cin>>n;
map<string,map<string,int>>mp;
for (int i = 0; i < n; i++)
{
string a,b;
int c;
cin>>a>>b>>c;
mp[b][a]+=c;
}
for (auto it = mp.begin(); it != mp.end(); it++)
{
cout<<it->first<<endl;
for (auto it2 = it->second.begin(); it2 != it->second.end(); it2++)
{
cout<<" |----"<<it2->first<<"("<<it2->second<<")"<<endl;
}
}
if (t) cout<<endl;
}
}
list 双向链表,内存不连续
- 构造函数:
list<int>li
常用函数:push_back() push_front() pop_back() pop_front() insert() erase() - 不支持随机访问,插入、删除O(1),与vector相反
sort
vector<int>ve({4,3,5,2,6,1});
sort(ve.begin(),ve.end());
sort(ve.begin(),ve.end(),greater<int>());
bool cmp(int a,int b)
{
if(a%2==b%2) return a<b;
return a%2>b%2;
}
sort(ve.begin(),ve.end(),cmp);
reverse 翻转数组、容器
int x[1005];
reverse(x+1,x+1+n);
vector<int>ve;
reverse(ve.begin(),ve.end());
next_permutation
求全排列中字典序更大的一个序列,不存在更大时返回false
int x[105];
int n=5;
for(int i=1;i<=n;i++)x[i]=i;
do{
for(int i=1;i<=n;i++)printf("%d ",x[i]);
puts("");
}while(next_permutation(x+1,x+1+n));
有待了解
- multiset
- priority_queue
- deque
- unordered_map