目录
前言
一、并查集
1、并查集的合并(带路径压缩)
2、询问是否为同一个集合
3、例题
二、前缀和
1 、前缀和是什么
2、经典题目
三- 字符串处理
1、字符串的插入
2、字符串转化为int类型
3、字符反转
前言
并查集合前缀,字符串和在往年考试出现频率不算太高,但也会涉及到,考察的时候往往结合一些其他知识带点一起考察,当然也不排除今年蓝桥杯会考察到,学一下也是未自己增加一份保险
一、并查集
并查集,类似于树的组合,俩个数如何以最短的时间复杂度,实现合并,就是把一个树的根连到另一个树上去,时间复杂度近乎为1;
维护n个元素,刚开始每个元素自己一个集合,支持两个操作。
- 合并两个元素所在的集合
- 询问两个元素是否在相同的集合内
其他支持:
- 维护每个元素和同一个集合内的其他元素的关系
- 每个元素所在的集合的大小
并查集这个算法,他有自己的模板操作
1、并查集的合并(带路径压缩)
代码语言:javascript复制int find (int x)
{
if(p[x] != x ) p[x] = find(p[x]); //父节点等于祖宗节点
return p[x];
}
p[find(a)] = find(b); //使a的祖宗节点的父节点等于b的父节点实现转接
2、询问是否为同一个集合
代码语言:javascript复制if(find(a) == find(b))
3、例题
代码
代码语言:javascript复制#include <bits/stdc .h>
using namespace std;
const int N = 100010;
int n,m;
int p[N];
int find (int x)
{
if(p[x] != x ) p[x] = find(p[x]); //父节点等于祖宗节点
return p[x];
}
int main()
{
cin>>n>>m;
for(int i = 1;i <= n; i ) p[i] = i; //根据题目要求使得每个数各自在一个集合
while(m--)
{
char op[2];
int a,b;
scanf("%s%d%d",op,&a,&b); //输入字符串,因为scanf常常读入一些空格之类,使用字符串类型比较保险
if(op[0] == 'M') p[find(a)] = find(b); //使a的祖宗节点的父节点等于b的父节点实现转接
else
{
if(find(a) == find(b)) puts("Yes");
else puts("No");
}
}
return 0;
}
2020蓝桥杯b组第四题考到DFS和并查集的内容,感兴趣可以尝试做一下真题
二、前缀和
1 、前缀和是什么
一维数组的前缀和很简单可以通过下面的例题来理解
2、经典题目
输入一个长度为 n的整数序列。 接下来再输入 m个询问,每个询问输入一对 l,r。 对于每个询问,输出原序列中从第 l个数到第 r 个数的和。 输入格式 第一行包含两个整数 n 和 m。 第二行包含 n 个整数,表示整数数列。 接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。 输出格式 共 m 行,每行输出一个询问的结果。
输入样例:
代码语言:javascript复制
5 3
2 1 3 6 4
1 2
1 3
2 4
输出样例:
代码语言:javascript复制
3
6
10
代码
代码语言:javascript复制#include <bits/stdc .h>
using namespace std;
const int N = 100010;
int main()
{
int n,m;
int a[N],s[N] ;
cin>>n>>m;
for(int i =1;i <= n;i ) cin>>a[i];
for(int i =1;i <= n;i ) s[i]= s[i-1] a[i];
while(m--)
{
int l,r;
cin>>l>>r;
cout<<s[r] - s[l-1]<<endl;
}
}
三- 字符串处理
字符串题目考察频率也还行,学会简单的几个字符串STL的函数,可以帮助我们解决复杂的问题,
下面介绍几个
1、字符串的插入
string s = "abcdef" s1 = s.substr (2) //从下标为2的字符开始截取到结尾,s1 = "cdef"; s2 = s.substr(2,3) //从下标为2的2字符截取长度为3的字符串 s2 = "cde";
2、字符串转化为int类型
string 类型转化为int 型 stol() string 类型转化为long long型 stoll()
代码
代码语言:javascript复制 string s = "12345";
int t = stol(s);
printf("%dn",t);
long long m = stoll(s);
printf("%lld",m);
3、字符反转
输入一个字符串,想使其反转过来
string s; reverse(s.begin(),s.end());