蓝桥杯备考
好好休息,有个不过度焦虑、健康的脑子比啥都好使。
核心思想
- 可能比较难,如果不是一眼能看出来,就优先做一个简单的暴力,后面写正解调试也方便
- 大不了就是省二,放宽心,累了就呼吸一分钟,不会影响什么的
- 仔细,仔细,仔细。尤其是填空题😄宁可多用几种方法做做、多测试一下小数据靠不靠谱
做题思路
-
耐心读题,如果感觉想思路复杂一些,可以:
- 先出两组数据自己手模一下再开始写。边缘情况很难一边写代码一边想清楚。
- 拆解思路,落到笔头上比在脑子想容易的多。
-
边缘数据
-
循环终止条件
还算触手可及的小代码
👉邻接表
int adj[N],m_;
int to[M],nxt[M];
void add(int x,int y)
{
to[++m_]=y;
nxt[m_]=adj[x];
adj[x]=m_;
}
void tre_dfs(int x,int fa)
{
for(int i=adj[x];i;i=nxt[i])
{
int c=to[i];
if(c==fa)
continue;
tre_dfs(c,x);
}
}
👉LCA
int jmp[N][K],lca[N][K],dep[N];
//lca位运算
void init(int x,int fa)
{
dep[x]=dep[fa]+1;
jmp[x][0]=fa;
//lca[x][0]=...
for(int i=1;i<=20;i++)//calculate lca[x][1,2,3...]
{
int d=jmp[x][i-1];
jmp[x][i]=jmp[d][i-1];
//lca[x][i]=...
}
for(int i=adj[x];i;i=nxt[i])
{
int c=to[i];
if(c==fa)
continue;
init(c,x);
}
}
int query(int x,int y)
{
if(dep[x]<dep[y])
swap(x,y);
int i,ans=0;
//jmp x to the same dep with y
for(i=20;i>=0;i--)
if(dep[jmp[x][i]]>=dep[y])//calculate ans before jmp!
ans|=lca[x][i],
x=jmp[x][i];
if(x==y)//->think carefully about the head
return ans|lca[x][0];
for(i=20;i>=0;i--)
{
int xx=jmp[x][i];
int yy=jmp[y][i];
if(xx==yy)//jmp to the one before the same_father
continue;
//calculate ans before jmp!
ans|=lca[x][i];
ans|=lca[y][i];
x=xx,y=yy;
}
//calculate ans before jmp!
ans|=lca[x][0];
ans|=lca[y][0];
//->think carefully about the head
int p=jmp[x][0];
ans|=lca[p][0];
return ans;
}
int main()
{
//add(x,y),add(y,x);
}
👉GCD
long long gcd(long long x,long long y)
{
return y?gcd(y,x%y):x;
}
👉KSM
long long ksm(long long base,long long x)
{
long long ret=1;
for(;x;x>>=1,base=base*base%mod)
if(x&1)
ret=ret*base%mod;
return ret;
}
👉二维前缀和
int pre[n + 1][m + 1]; pre[0][0] = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
pre[i][j] = pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1] + a[i][j];
👉数组去重/双指针
int i = 0;
for (int j = 1; j < n; j++)
if (a[j] != a[i])
a[++i] = a[j];
// 去重后数组长度为 i + 1
👉并查集
int fa[n];
void init() { for (int i = 0; i < n; i++) fa[i] = i; }//!!!!!
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
void merge(int x, int y) { fa[find(x)] = find(y); }
👉MAP
#include<map>
map<int,int> myMap;
int main()
{
myMap[1]=20;
cout<<myMap[1];
//迭代器
for (auto it = myMap.begin(); it != myMap.end(); ++it) {
cout << it->first << ": " << it->second << endl;
}
auto it = myMap.find(2);
if (it != myMap.end()) {
cout << it->second << endl; // 输出20
}
}
👉优先队列
#include <queue>
priority_queue<int> pq1;
int main() {
pq1.push(3); pq1.push(1); pq1.push(2); // pq1 中元素:3, 1, 2(内部堆结构,非显式排序)
cout << pq1.top(); // 输出 3(大顶堆顶)
pq1.pop(); // 弹出 3,此时堆顶为 2
if (pq1.empty()) cout << "空"; else cout << "非空";
return 0;
}
struct Node { int val; };
bool operator<(const Node& a, const Node& b)
{
return a.val < b.val;
} // 大顶堆
priority_queue<Node> pq3;