B
前言
t
a
g
:
tag :
tag: 思维
并查集
题意 :
给定一个字符数组包含<>
表示向左向右走
询问有多少个
i
i
i满足,可以根据<>
走出边界
思路 :
看完这题一眼就并查集了。我们发现不管怎么样最后的点都会经过两边。因此我们将走向两边的点分为两个集合
同时判断两边是否合法,判断当前集合是否满足即可
因为一眼题了,对于这个题也没细想。看了题解之后发现。我们并不需要分集合,因为向左边的路只能是<<<
向右边走的路只能是>
所以我们统计一下前后缀即可
code :
char s[N];
int L[N],R[N],n;
bool flag[N];
int find(int x){
if(x!=L[x]) L[x] = find(L[x]);
return L[x];
}
void init(){
Fup(i,1,n){
L[i] = R[i] = i;
}
}
void solve(){
cin>>n;
init();
cin>>(s+1);
if(s[1] == '<') flag[1] = 1;
if(s[n] == '>') flag[n] = 1;
Fup(i,1,n){
if(s[i] == '<' && i!=1){
int fa = find(L[i]);
int fb = find(L[i-1]);
L[fa] = fb;
}else if(i!=n && s[i] == '>'){
int fa = find(L[i]);
int fb = find(L[i+1]);
L[fa] = fb;
}
}
int cnt = 0 ;
Fup(i,1,n){
int fi = find(L[i]);
if(flag[fi]){
++cnt;
}
}
cout<<cnt<<endl;
}
int main(){
//int t;cin>>t;while(t--)
solve();
return 0 ;
}