10月1日到10月4日
ljs:c语言基础 前缀和 差分
syx:c++基础stl或者排序二分
wjq:分支归并,归并排序,双指针
la: bfs + dfs
每天上午十点到1点半,下午三点半到晚上七点
ACM协会10月2日上午 培训录像 (暂时只有这个,其他录屏尚未上传)
10月1日:
李学长介绍了C语言的基本语法(如布尔类型、数组、结构体)、洛谷、acwing等等算法类网站,熟悉了Dev-c++编译器。并针对牛客编程语言练习赛第四场进行了讲解,重点讲解了“金字塔图案”和“空心三角形图案”。讲解了前缀和,并以洛谷题P5638为例进行了演示。
宋学长介绍了比赛中经常用到的C++的一些基本知识,比如控制输入输出流,万用头文件等等。
10月2日:
宋学长讲解了STL容器相关(如动态数组、映射、队列、双端队列、优先队列、栈、迭代器等等)知识,科普了ACM赛制和OI赛制的区别。提及了bfs(广度优先搜索}。介绍了时间复杂度和二分算法、sort函数。讲解了set与multiset之间的区别。介绍了宏定义。讲解排序函数时提及关键字,类比于EXCEL中的关键字。提及哈希算法。介绍了数组最大空间和O2优化。推荐了算法类书籍。
李学长带着做题,推荐了Codeforces和AtCoder等刷题网站。并建议大家在博客园开博客,养成写技术博客的习惯。
10月3日:
王学长以汉诺塔问题为例讲解了递归,讲解了归并分支和归并排序等等知识。下午主要带着一起做题,介绍了记忆化。
10月4日:
L_A讲解了逆波兰表达式、回溯、PFS(深度优先搜索)、BFS(广度优先搜索)等内容。ppt上漏了写退队。下午指导了一波洛谷题。
#include<algorithm>//加容器名字头文件?
vector<int>v; //声明int类型动态数组。动态数组不用分配大小。每个数组长度是动态的
vector<int>v[10];//二维数组
v.push_back(i);//将i存入v
v.begin();//指向第一个迭代器(迭代器类似于指针,表示地址之用)
v.end();///指向最后一个迭代器(动态数组尾端的下一位)
acm赛制10~13题,一道就交,提交错误有罚时,拼手速
oi赛制,只交一次
sort(v.begin(),v.end());//排序函数,默认从小到大排序
sort(v.begin(),v.end(),cmp);
bool cmp(int a,int b){ //comp或cmp,自写从大到小排序
if(a>b)return true;
else return false;
}
二分算法
时间复杂度:
O(n),一个for
O(logn),二分算法
O(n^2),两个for嵌套
O(nlogn),排序最快
O(n^3),
set<int> s; //集合,不允许出现重复元素。自动排序
multiset<int> ms; //可存在重复元素
excel表格第一关键字、第二关键字
struct ljs{ //定义结构体
int eng,che,math,tot;
};
bool cmp (const &a,const ljs &b){
if(a.tot>b.tot) return true;
else if(a.tot==b.tot){
return(a.math>b.math); //总分相同时返回数学高
}
else return false;
}
v.clear(); //清空容器
int a[10];
memset(a,0,sizeof(a)); //把数组清零
#include<string> //C++string类成员函数
string s;
reverse(s.begin(),s.end()); //反转函数
queue队列,先进先出,只能从队尾插入,从队首弹出。front、back,不支持下标访问
deue双端队列,类似队列但可从队首插入
stack栈
priority_queue优先队列,队列放入后自动排序,默认从大到小。从小到大可通过存入负数实现
for(queue<int>::iterator it=q.begin();it!=q.end();it++){
cout<<(*it)<<" ";
}
1 /* 2 背单词,会则输出yes,不会则输出。输入整数n,n行,每行一个数字(0或1)和一个单词。 3 0表示记忆单词,1表示询问记过没。对每次询问,输出yes或no 4 */ 5 #include<bits/stdc++.h> 6 #include<set>> 7 #define ll long long 8 #define rep(i,a,b) for(int i=a;i<=b;i++) 9 #define rpe(i,a,b) for(int i=a;i>=b;i--) 10 using namespace std; 11 set <string> s; 12 int main(){ 13 int n; 14 cin>>n; 15 while(n--){ 16 int x; 17 string word; 18 cin>>x>>word; 19 if(x==0){ 20 s.insert(word); 21 } 22 else{ 23 if(s.count(word)==0){ 24 cout<<"no"<<endl; 25 } 26 else{ 27 cout<<"yes"<<endl; 28 } 29 } 30 } 31 return 0; 32 }
set lower_bound
upper_bound
#include<map> //映射
map<type1,type2> m;
m[type1]=m[type2]; //建立映射关系
map[]下标可以是任意类型
哈希算法
C++开O2优化
编译选项 ~std=C++14
紫书 刘汝佳 算法竞赛入门经典
李煜东 算法进阶指南
int solve(int l,int r){
if(l==r) return 1; //递归一定要有终止条件,且终止条件
int ans=solve(l,r-1);
ans+=r;
return ans;
}
int main{
solve(1,100);
}
典型的递归:汉诺塔
分治:将问题分解到无法再分
int solve(int l,int r){
if(l==r) return 1;
int mid=(1+r)/2;
int ans=solve(1,mid)+slove(mid+1,r);
return ans;
}
归并排序
a.resize(n);
记忆化
int f[1000];
if(f[n]) return f[n];
return f[n]=ans;
hed=1;队列头,
tal队列尾
que[1][0]sn,行 que[1][]=sm;尾