#include <bits/stdc++.h>
using namespace std;
const int N = 10;
void solve(){
int a[N];
int n;
cin >> n;
int flag = 1; //记录打开的门的数量
for(int i = 1; i <= 3; i++) cin >> a[i];
for(int i = n; a[i] != 0; i = a[i]) flag++;
if(flag == 3) cout << "YES" << "\n";
else cout << "NO" << "\n";
}
int main(){
int _;
cin >> _;
while(_--){
solve();
}
return 0;
}
注意:开long long
!开long long
!开long long
!
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
int a[N];
int b[N],c[N];
void solve(){
int n, m;
cin >> n >> m;
for(int i = 1 ; i <= n ; i++){
cin >> a[i];
if(a[i] < a[i-1]){
b[i] = a[i-1] - a[i]; //处理前缀
}
else if(a[i] > a[i-1]){
c[i] = a[i] - a[i-1]; //处理后缀
}
b[i] += b[i-1]; //构造前缀和数组
c[i] += c[i-1]; //构造后缀和数组
}
while(m--){
int l, r;
cin >> l >> r;
if(l < r){
cout << b[r] - b[l] << "\n";
}
else cout << c[l] - c[r] << "\n";
}
}
signed main(){
solve();
return 0;
}
dep
表示当前遍历到的还未配对的(
的数量,vis
表示当前遍历到的?
的数量s
dep
:若s[i] == '('
,则dep++
,若s[i] == ')'
,则dep--
vis
:若s[i] == '?'
,则vis++
,dep
的状态会影响序列的唯一性 dep < 0
,则在之前遍历的序列中,必然存在至少一个?
即(vis>0
),使得括号序列合法,且?
的状态将唯一确定,此时dep++,vis--
dep == 0 && vis == 1
,则在之前遍历的序列中,?
的状态也将唯一确定,此时dep++,vis--
dep
和vis
唯一确定的状态已经消去,故现在只剩下了还未确定唯一性状态的dep
和vis
abs(dep) == vis
,说明剩下的状态也将唯一确定并消去,该括号序列合法且唯一,反之则不符合。#include <bits/stdc++.h>
using namespace std;
void solve(){
string s;
cin >> s;
int dep = 0, vis = 0;
for(int i = 0 ; i < s.size() ; i++){
if(s[i] == '(') dep++;
else if(s[i] == ')'){dep--;
if(dep < 0){
if(vis > 0)dep++, vis--;
else{ //vis <= 0 说明无法匹配,序列非法
dep = 1, vis = 0;
break;
}
}
}
else vis++;
if(dep == 0 && vis == 1) dep++, vis--;
}
if(abs(dep) == vis) cout << "YES" << '\n';
else cout << "NO" << '\n';
}
int main(){
int _;
cin >> _;
while(_--){
solve();
}
return 0;
}