牛客周赛 Round 38(A,B,C,D,E,F,G)

比赛链接

官方讲解(不分P不分段直接两小时怼上来是坏文明

这场的题很棒,思维有难度,考察的知识点广泛,有深度,很透彻。感觉学到了很多。建议补题。


A 小红的正整数自增

思路:

签到。

可以模拟一下,看加上几次,个位就变成 0 0 0 了。

或者可以用 10 10 10 减一下个位数,看看离进位差几。

code:

#include <cstdio>
#include <iostream>
using namespace std;int n;int main(){cin>>n;cout<<(10-n%10)%10;return 0;
}

B 小红的抛弃后缀

思路:

有一个初等数论的知识点可以秒掉此题: 一个数是 9 的倍数 ⇔ 这个数十进制数码的和能被 9 整除 一个数是 9 的倍数\Leftrightarrow这个数十进制数码的和能被9整除 一个数是9的倍数这个数十进制数码的和能被9整除

比如 1233 1233 1233 的各个数位上的数分别为 1 , 2 , 3 , 3 1,2,3,3 1,2,3,3,它们的和 1 + 2 + 3 + 3 = 9 1+2+3+3=9 1+2+3+3=9 可以被 9 9 9 整除,那么 1233 1233 1233 这个数就可以被 9 9 9 整除,反之也成立。

所以我们删掉一个后缀使得剩余的数能被 9 9 9 整除,其实就相当于去验证剩余的前缀的数字之和能被 9 9 9 整除即可。

我们跑一遍前缀和,并检查每个前缀和能否被 9 9 9 整除。能被整除的前缀和的个数就是答案。

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
const int maxn=1e5+5;int n,s[maxn],ans;
string str;int main(){cin>>str;n=str.length();str=" "+str;for(int i=1;i<=n;i++){s[i]=(s[i-1]+str[i]-'0')%9;if(!s[i])ans++;}cout<<ans<<endl;return 0;
}

不止 9 9 9 有这种性质,其他很多数也有各种不同的性质。它们基本都是通过同余的性质来证明的,证明可以看:初等数论-同余性质的应用。


C 小红的字符串构造

思路:

如果我们全部填入一个相同的字母,那么最多可以出现 1 + 2 + 3 + ⋯ + n − 1 = n ∗ ( n − 1 ) 2 1+2+3+\dots+n-1=\dfrac{n*(n-1)}{2} 1+2+3++n1=2n(n1) 个回文串,但是题目却保证 k ≤ n 2 k\le \dfrac{n}2 k2n,这就很奇怪。

考虑到我们两个相同的字母放在一起就可以用两个字符组成一个回文串,这就正好和题目的 k ≤ n 2 k\le \dfrac{n}2 k2n 对应上了。所以我们用 a a b b c c a a b b c c … aabbccaabbcc\dots aabbccaabbcc 这种方式来组回文串——两个字符组成一个回文串,为了防止出现其他回文串,需要至少三种字符来进行循环。

k k k 个回文串,那么前面需要 2 k 2k 2k 个字符来凑。后面多余的位置就可以用 d e f d e f d e f … defdefdef\dots defdefdef 这种方式来填充,同样的为了防止出现回文串,需要至少三种字符进行循环。

code:

"abc"[i%3] 相当于

char str[]="abc";str[i%3];

前面的字符串相当于一个匿名的字符数组。并且占有空间(应该?)。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;int n,k;
string s;int main(){cin>>n>>k;for(int i=1;i<=k;i++){s+="abc"[i%3];s+="abc"[i%3];}for(int i=2*k+1;i<=n;i++)s+="def"[i%3];cout<<s<<endl;return 0;
}

D 小红的平滑值插值

思路:

发现如果相邻两项的差值超过了 k k k,我们就需要向中间插入数字,将这个差值降下来。

而降差值的时候可以贪心地来进行,即每差 k k k 才插一个,差值要是还大就继续插,够了就往下看。这样如果差值为 d d d 的话,我们需要插 ⌈ d k ⌉ − 1 = ⌊ d − 1 k ⌋ \left\lceil\dfrac{d}{k}\right\rceil-1=\left\lfloor\dfrac{d-1}{k}\right\rfloor kd1=kd1个数。

不过如果中间不存在一个差值大于等于 k k k 的位置的话,我们就需要人为造一个差值为 k k k 的相邻的数。比如在最后补一个数,使得它和前面那个数差值为 k k k。所以我们需要看一下中间有没有一个差值大于等于 k k k 的位置。

code:

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=1e5+5;int n,k,a[maxn];
long long cnt=0;int main(){cin>>n>>k;for(int i=1;i<=n;i++)cin>>a[i];bool flag=false;for(int i=1,d;i<n;i++){d=abs(a[i]-a[i+1]);if(d>=k){cnt+=(d-1)/k;flag=true;}}if(!flag)cnt++;cout<<cnt<<endl;return 0;
}

E 小苯的等比数列

思路:

没想到被一个 1799 1799 1799 rate 的比赛的 E E E 题单防了。

这个题的思路其实很简单:就是枚举每一个数,让它作为等比数列的首项,并枚举公比,暴力进行验证即可。

当然需要一点点优化,因为每个数的值域很小,所以我们直接可以把每个数桶排序一下,把它扔进桶里,这样查找一个数的时间复杂度就可以降为 O ( 1 ) O(1) O(1) 的。不过公比为 1 1 1 的情况会不停验证下去,所以需要特判解决,我们之前用桶可以直接记录每个数的个数,就可以解决掉公比为 1 1 1 的情况。这时候再暴力就可以做到接近 O ( n ∗ l o g n ) O(n*log\,n) O(nlogn) 的逆天时间复杂度。

为啥时间复杂度这么低?枚举每个数当然是 O ( n ) O(n) O(n) 的,而对每个公比 d d d,我们最多只需要验证到 n d \dfrac{n}{d} dn 个公比就可以直接返回了(因为后面的数,数列第二项就会直接超出 2 ∗ 1 0 5 2*10^5 2105),而每个公比只需要验证 l o g d ( 2 ∗ 1 0 5 ) log_d(2*10^5) logd(2105) 次就会超出 2 ∗ 1 0 5 2*10^5 2105 的值域范围。可以写个程序打个表:(第一行是公比 d d d,第二行是执行次数 l o g d ( 2 ∗ 1 0 5 ) log_d(2*10^5) logd(2105)
在这里插入图片描述
其实平均每个公比也就跑了 2.00278 次。所以总的时间复杂度大概就是 O ( n 2 + n 3 + ⋯ + n n ≈ n ∗ l o g n ) O(\dfrac n2+\dfrac n3+\dots+\dfrac nn\approx n*log\,n) O(2n+3n++nnnlogn),然后带上一点常数,所以这样暴力跑是不会超时的。逆天。

code:

#include <iostream>
#include <cstdio> 
#include <vector>
#include <set>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;int n,vis[maxn],ans;int main(){cin>>n;for(int i=1,t;i<=n;i++){cin>>t;vis[t]++;}for(ll a0=1;a0<=2e5;a0++){if(!vis[a0])continue;ans=max(ans,vis[a0]);for(ll d=2;d<=2e5;d++){if(a0*d>2e5)break;int cnt=1;for(ll a=a0*d;;a*=d){if(a>2e5 || !vis[a]){ans=max(ans,cnt);break;}else cnt++;}}}cout<<ans<<endl;return 0;
}

F 小苯的回文询问

思路1(莫队):

发现是离线的区间询问,可以尝试使用莫队!借鉴这位大佬的。

考虑到是子序列长度 > 2 >2 >2 的回文串。所以我们只要保证有 有两个相同的数中间隔了一些数 这种情况出现就行。但是想用莫队就需要通过一些参数来描述上面这种情况,并且 [ l , r ] [l,r] [l,r] 区间的参数可以 O ( 1 ) O(1) O(1) 拓展到相邻的 [ l − 1 , r ] , [ l + 1 , r ] , [ l , r − 1 ] , [ l , r + 1 ] [l-1,r],[l+1,r],[l,r-1],[l,r+1] [l1,r],[l+1,r],[l,r1],[l,r+1] 区间。

两个相同的数中间隔了一些数的话,相当于需要两个相同的数不相邻,或者有三个及以上的相同的数。所以我们用 f 1 f1 f1 变量记录三个及以上的相同的数的个数,用 f 2 f2 f2 变量记录两个相同的数的个数。

如果 f 1 > 0 f1>0 f1>0 那么一定是有回文串的。如果 f 1 = = 0 f1==0 f1==0,这时候我们需要保证 两个相同的数 至少有一对不相邻,所以我们可以设置一个变量 s u m sum sum,记录相邻的相同的数有几对,如果 f 2 ! = s u m f2 !=sum f2!=sum,就说明至少有一对相同的数不相邻,这时也有回文串。

不过每个数的值域太大了,如果使用 m a p map map,时间会多出一个 l o g log log,总的时间复杂度为 O ( n ∗ l o g n + q n ∗ l o g n ) O(n*log\,n+q\sqrt n*log\,n) O(nlogn+qn logn),会超时。所以我们对每个数离散化预处理一下,这样时间复杂度就变成了 O ( n ∗ l o g n + q n ) O(n*log\,n+q\sqrt n) O(nlogn+qn ),可以通过。

code1:

上面那个大佬写的更加优美。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
using namespace std;
const int maxn=1e5+5;int n,q;int len,tot;
int a[maxn],L[maxn],R[maxn],belong[maxn];void init(){len=log2(n);tot=(n+len-1)/len;for(int i=1;i<=tot;i++){L[i]=R[i-1]+1;R[i]=i*len;}R[tot]=n;for(int i=1;i<=tot;i++)for(int j=L[i];j<=R[i];j++)belong[j]=i;
}struct itv{int l,r,id;bool ans;
}qy[maxn<<1];bool cmp1(const itv a,const itv b){return (belong[a.l]^belong[b.l])?a.l<b.l:((belong[a.l]&1)?a.r<b.r:a.r>b.r);}
bool cmp2(const itv a,const itv b){return a.id<b.id;}int f1,f2,sum;
//map<int,int> mp;
int mp[maxn];
void add(int x){mp[x]++;if(mp[x]==2)f1++;else if(mp[x]==3)f2++;
}
void del(int x){if(mp[x]==2)f1--;else if(mp[x]==3)f2--;mp[x]--;
}vector<int> ttt;
int find(int x){return lower_bound(ttt.begin(),ttt.end(),x)-ttt.begin()+1;
}int main(){cin>>n>>q;init();for(int i=1;i<=n;i++)cin>>a[i],ttt.push_back(a[i]);sort(ttt.begin(),ttt.end());ttt.erase(unique(ttt.begin(),ttt.end()),ttt.end());for(int i=1;i<=n;i++)a[i]=find(a[i]);
//	for(int i=1;i<=n;i++)cout<<a[i]<<" \n"[i==n];for(int i=1;i<=q;i++)cin>>qy[i].l>>qy[i].r,qy[i].id=i;sort(qy+1,qy+q+1,cmp1);int tl=1,tr=0,cnt=0;for(int i=1,l,r,t;i<=q;i++){l=qy[i].l;r=qy[i].r;while(tr<r){add(a[++tr]);if(a[tr]==a[tr-1])sum++;}while(tr>r){if(a[tr]==a[tr-1])sum--;del(a[tr--]);}while(tl<l){if(a[tl]==a[tl+1])sum--;del(a[tl++]);}while(tl>l){add(a[--tl]);if(a[tl]==a[tl+1])sum++;}if(f2 || (f1 && sum!=f1))qy[i].ans=true;}sort(qy+1,qy+q+1,cmp2);for(int i=1;i<=q;i++)puts((qy[i].ans)?"YES":"NO");return 0;
}

思路2:

同样的,我们想要两个相同的数中间隔了一些数的话,这时就是有回文子序列的。那么我们可以处理出每个位置的数的前一个不相邻的相同数的位置,假设是 l s t [ i ] lst[i] lst[i]。这样,对一个区间,我们只要保证 [ l , r ] [l,r] [l,r] 区间里有一个 l s t [ i ] ≥ l lst[i]\ge l lst[i]l 即可。

因为只要存在一个这样的 l s t [ i ] lst[i] lst[i] 就行,所以我们查询 l s t lst lst 的区间最大值,只要这个最大值满足条件就行了。而区间离线询问,可以跑线段树,ST表啊之类的都可以。

不过发现一个性质,就是 l s t [ i ] < i lst[i]<i lst[i]<i。所以在 i < l i<l i<l 的位置,都满足 l s t [ i ] < l lst[i]<l lst[i]<l,这意味着 l s t [ i ] > l lst[i]>l lst[i]>l 的情况一定发生在 i ∈ [ l , r ] i\in [l,r] i[l,r] 的区间内,查询最大值的时候加入前缀不会影响结果大于等于l。因此我们直接处理出 l s t lst lst 的前缀 m a x max max,然后查询是否满足 l s t [ r ] ≥ l lst[r]\ge l lst[r]l 就行了。

code2:

#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
const int maxn=1e5+5;int n,q;
int a[maxn],lst[maxn];
map<int,int> mp;int main(){cin>>n>>q;for(int i=1;i<=n;i++){cin>>a[i];lst[i]=mp[a[i]];mp[a[i]]=i;}for(int i=n;i>=1;i--)if(lst[i]==i-1)lst[i]=lst[lst[i]];for(int i=2;i<=n;i++)lst[i]=max(lst[i-1],lst[i]);for(int i=1,l,r;i<=q;i++){cin>>l>>r;puts((lst[r]>=l)?"YES":"NO");}return 0;
}

G 小红的区间删除

思路:

区间删除很难想,不如先看看单点删除。一个数放在某个位置上可以产生多少逆序对,就说明被删掉后会失去多少逆序对。而在某个位置插入一个数的话,它会和这个位置之前的每个比它大的数产生一对逆序对,以及和这个位置之后的每个比它小的数产生一对逆序对。

因此我们删掉一个点的剩余逆序对对数,相当于总的逆序对个数要减去 序列中在这个位置之前的比它大的数的个数和这个位置之后的比它小的数的个数。而区间删除就是一个点一个点地删掉。

我们要删掉中间一段连续的区间,然后剩余的部分的逆序对个数 ≥ k \ge k k,所以我们可以通过上面的单点修改一个一个删掉中间的部分,得到剩余部分的逆序对个数。

因为我们删掉的数越多,逆序对数就越少,它是单调的。所以我们只要对每个右端点 r r r 找到满足条件的最小的 l l l,那么中间所有的位置都可以作为满足条件的左端点。而也因为是单调的,我们可以使用双指针来移动左右端点。这样移动指针的复杂度就降为了 O ( n ) O(n) O(n),移动一次的复杂度为 O ( l o g n ) O(log\,n) O(logn),可以通过。

不过因为什么都不删也是一种方法,所以我们需要特判一下,如果什么都不删都不满足条件,就直接输出 0 0 0。否则答案额外加上这个特殊情况。

值域给的很贴心,不用离散化了。

code:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
const int maxf=1e6+5;int n;
ll k;
int a[maxn];ll cnt=0,ans;//剩余部分逆序对个数 答案 
struct tree_array{const int _n=1e6;int tr[maxf];int lowbit(int x){return x&-x;}void add(int idx,int x){for(int i=idx;i<=_n;i+=lowbit(i))tr[i]+=x;}int query(int idx){int ans=0;for(int i=idx;i;i-=lowbit(i))ans+=tr[i];return ans;}int qpre(int idx){//<idx的数个数 return query(idx-1);}int qsuf(int idx){//>idx的数个数 return query(_n)-query(idx);}
}t1,t2;int main(){cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];cnt+=t2.qsuf(a[i]);t2.add(a[i],1);}if(cnt>=k)ans=1;else return cout<<0,0;for(int l=1,r=1;r<=n;r++){//删掉a[r] cnt-=t1.qsuf(a[r])+t2.qpre(a[r]);t2.add(a[r],-1);//加入a[l] while(l<=r && cnt<k){cnt+=t1.qsuf(a[l])+t2.qpre(a[l]);t1.add(a[l],1);l++;}ans+=(r-l+1);}cout<<ans<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/770966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.5 Batch Normalization

在训练神经网络时&#xff0c;往往需要标准化&#xff08;normalization&#xff09;输入数据&#xff0c;使得网络的训练更加快速和有效。 然而SGD&#xff08;随机梯度下降&#xff09;等学习算法会在训练中不断改变网络的参数&#xff0c;隐藏层的激活值的分布会因此发生变…

VTK对属性参数的设置,以及用vtkFieldData存储属性数据的方法

数据集的属性&#xff08;属性数据&#xff09;是与数据集结构相关联的。而数据集又是建立在点和单元的基础上&#xff0c;所以数据属性很自然地是与点和单元相关联。即每个点或每个单元都有与其对应的数据属性。 数据属性的值称为属性数据。属性数据一般设置为一些有实际意义的…

学生宿舍智能控电柜安装调试技术

学生宿舍智能控电柜安装调试石家庄光大远通电器有限公司宿舍控电限电管理系统是一种用于管理学生宿舍用电的智能系统&#xff0c;主要功能包括: 1.实时监控和控制:该系统能够实时监测和记录宿舍的用电情况&#xff0c;包括电器使用情况、电量消耗等。管理人员可以通过电脑或手机…

探索酷开科技独特魅力|加入酷开会员让观影之旅更畅快|酷开系统

你是否渴望一场震撼心灵的观影之旅&#xff1f;不妨走进酷开系统的世界&#xff0c;徜徉在剧集的海洋&#xff0c;满足无限观影的渴望&#xff01;还在担心剧荒吗&#xff1f;还在为无聊的周末发愁吗酷开系统为你赶走无聊&#xff0c;它拥有海量的影视资源&#xff0c;4大片库、…

nginx详解(持续更新)

nginx定义 nginx安装 nginx目录 程序相关命令 服务相关命令 虚拟主机&#xff08;server&#xff09; 路由匹配&#xff08;location&#xff09; 代理&#xff08;proxy_pass&#xff09; 正向代理 反向代理 负载均衡&#xff08;upstream&#xff09; 负载均衡策略 动静分…

C++ 简单模拟实现 STL 中的 list 与 queue

目录 一&#xff0c;list 1&#xff0c; list 的节点与迭代器 2&#xff0c;list 的数据结构、一些简单的功能、构造函数 3&#xff0c;list 的对元素操作 4&#xff0c;C 11 的一些功能 5&#xff0c;完整代码&#xff1a; 二&#xff0c;queue 一&#xff0c;list std…

开源 OLAP 及其在不同场景下的需求

目录 一、开源 OLAP 综述 二、OLAP场景思考 2.1 面向客户的报表 2.2 面向经营的报表 2.3 末端运营分析 2.4 用户画像 2.5 订单分析 2.6 OLAP技术需求思考 三、开源数据湖/流式数仓解决方案 3.1 离线数仓体系——Lambda架构 3.2 实时数据湖解决方案 3.3 实时分析解决…

Java毕业设计-基于springboot开发的校园台球厅人员与设备管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的校园台球厅人…

Linux-1.常见指令以及权限理解

目录 本节目标 使用 XShell 远程登录 Linux 关于 Linux 桌面 下载安装 XShell 查看 Linux 主机 ip 使用 XShell 登陆主机 XShell 下的复制粘贴 Linux下基本指令 登录Linux服务器 新建多用户 全屏 1.快速认识5~6个命令 2.详细谈论课件的所有指令 01. ls 指令 02…

初识redis(一)

前言 引用的是这本书的原话 Redis[1]是一种基于键值对&#xff08;key-value&#xff09;的NoSQL数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis中的值可以是由string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列…

33.HarmonyOS App(JAVA)鸿蒙系统app数据库增删改查

33.HarmonyOS App(JAVA)鸿蒙系统app数据库增删改查 关系数据库 关系对象数据库&#xff08;ORM&#xff09; 应用偏好数据库 分布式数据库 关系型数据库&#xff08;Relational Database&#xff0c;RDB&#xff09;是一种基于关系模型来管理数据的数据库。HarmonyOS关系型…

Pandas与Jupyter Notebook的完美结合【第153篇—数据分析】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 利用Python进行数据分析&#xff1a;Pandas与Jupyter Notebook的完美结合 在数据科学和分析…

职场口才提升之道

职场口才提升之道 在职场中&#xff0c;口才的重要性不言而喻。无论是与同事沟通协作&#xff0c;还是向上级汇报工作&#xff0c;亦或是与客户洽谈业务&#xff0c;都需要具备良好的口才能力。一个出色的职场人&#xff0c;除了拥有扎实的专业技能外&#xff0c;还应具备出色…

web自动化测试系列-selenium的安装和运行(一)

目录 web自动化系列之如何安装selenium 1.web自动化中的三大亮点技术 2.web自动化能解决什么问题 &#xff1f; 3.为什么是selenium ? 4.selenium特点 5.selenium安装 6.下载浏览器及驱动 7.测试代码 web自动化系列之如何安装selenium web自动化 &#xff0c;一个老生…

【C++】vector介绍

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. vector的介绍3. Member functions3.1 (constructor)3.2 (destructor) 4. Capacity4.1 resize4.2 reserve4.3 shrink_to_fit 5. vector 增删查改5.1 push_back5.2 insert5.3 pop_back5.4 find5.5 erase 1. 前…

【C++】模板与泛型编程

文章目录 1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化 4. 非类型模板参数5. 模板的特化5.1 概念5.2 函数模板特化5.3 全特化5.4 偏特化5.5 类模板…

Docker 搭建Redis集群

目录 1. 3主3从架构说明 2. 3主3从Redis集群配置 2.1关闭防火墙启动docker后台服务 2.2 新建6个docker容器实例 2.3 进去任意一台redis容器&#xff0c;为6台机器构建集群关系 2.4 进去6381&#xff0c;查看集群状态 3. 主从容错切换迁移 3.1 数据读写存储 3.1.1 查看…

【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

java switch用法

满足那个条件&#xff0c;就从那个入口进入&#xff0c;没有break就继续&#xff08;是这样设计的&#xff0c;需要自己加break;&#xff09;&#xff0c;一般都是要加break的。 switch (表达式) 表达式只能是【整型、char、String.】 import java.util.Scanner;public class…

微服务day07 -- ES集群

4.集群 单机的elasticsearch做数据存储&#xff0c;必然面临两个问题&#xff1a;海量数据存储问题、单点故障问题。 海量数据存储问题&#xff1a;将索引库从逻辑上拆分为N个分片&#xff08;shard&#xff09;&#xff0c;存储到多个节点 单点故障问题&#xff1a;将分片数…