You are given two strings S S S and T T T of length N N N consisting of A
and B
. Let S i S_i Si denote the i i i-th character from the left of S S S.
You can repeat the following operation any number of times, possibly zero:
Choose integers i i i and j j j such that KaTeX parse error: Expected 'EOF', got '&' at position 9: 1\leq i &̲lt; j \leq N. Replace S i S_i Si with A
and S j S_j Sj with B
.
Determine if it is possible to make S S S equal T T T. If it is possible, find the minimum number of operations required.
2 ≤ N ≤ 2 × 1 0 5 2 \leq N \leq 2 \times 10^5 2≤N≤2×105
Each of S S S and T T T is a string of length N N N consisting of A
and B
.
All input numbers are integers.
The input is given from Standard Input in the following format:
N N N
S S S
T T T
If it is impossible to make S S S equal T T T, print -1
.
Otherwise, print the minimum number of operations required to do so.
5
BAABA
AABAB
2
Performing the operation with i = 1 i=1 i=1 and j = 3 j=3 j=3 changes S S S to AABBA
.
Performing the operation with i = 4 i=4 i=4 and j = 5 j=5 j=5 changes S S S to AABAB
.
Thus, you can make S S S equal T T T with two operations. It can be proved that this is the minimum number of operations required, so the answer is 2 2 2.
2
AB
BA
-1
It can be proved that no matter how many operations you perform, you cannot make S S S equal T T T.
具体见文后视频。
#include
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
int N;
string S1, S2;
cin >> N >> S1 >> S2;
S1 = ' ' + S1, S2 = ' ' + S2;
std::vector<int> A, B;
for (int i = 1; i <= N; i ++)
if (S1[i] == 'A' && S2[i] == 'B')
B.push_back(i);
for (int i = 1; i <= N; i ++)
if (S1[i] == 'B' && S2[i] == 'A')
A.push_back(i);
int Pair = 0;
for (int i = 0, j = 0; i < A.size(); i ++)
{
while (j < B.size() && B[j] < A[i]) j ++;
if (j < B.size() && B[j] >= A[i]) Pair ++, j ++;
}
bool F1 = 0, F2 = 0;
if (A.size())
for (int i = A.back() + 1; i <= N; i ++)
if (S2[i] == 'B')
F1 = 1;
if (B.size())
for (int i = 1; i < *(B.begin()); i ++)
if (S2[i] == 'A')
F2 = 1;
if ((!F1 && A.size()) || (!F2 && B.size())) cout << -1 << endl;
else cout << A.size() + B.size() - Pair << endl;
return 0;
}
You are given a sequence A A A of length N N N consisting of integers between 1 1 1 and 10 \textbf{10} 10, inclusive.
A pair of integers ( l , r ) (l,r) (l,r) satisfying 1 ≤ l ≤ r ≤ N 1\leq l \leq r\leq N 1≤l≤r≤N is called a good pair if it satisfies the following condition:
The sequence ( A l , A l + 1 , … , A r ) (A_l,A_{l+1},\ldots,A_r) (Al,Al+1,…,Ar) contains a (possibly non-contiguous) arithmetic subsequence of length 3 3 3. More precisely, there is a triple of integers ( i , j , k ) (i,j,k) (i,j,k) with KaTeX parse error: Expected 'EOF', got '&' at position 10: l \leq i &̲lt; j < k\le… such that A j − A i = A k − A j A_j - A_i = A_k - A_j Aj−Ai=Ak−Aj.
Find the number of good pairs.
3 ≤ N ≤ 1 0 5 3 \leq N \leq 10^5 3≤N≤105
1 ≤ A i ≤ 10 1\leq A_i \leq 10 1≤Ai≤10
All input numbers are integers.
The input is given from Standard Input in the following format:
N N N
A 1 A_1 A1 … \ldots … A N A_N AN
Print the answer.
5
5 3 4 1 5
3
There are three good pairs: ( l , r ) = ( 1 , 4 ) , ( 1 , 5 ) , ( 2 , 5 ) (l,r)=(1,4),(1,5),(2,5) (l,r)=(1,4),(1,5),(2,5).
For example, the sequence ( A 1 , A 2 , A 3 , A 4 ) (A_1,A_2,A_3,A_4) (A1,A2,A3,A4) contains an arithmetic subsequence of length 3 3 3, which is ( 5 , 3 , 1 ) (5,3,1) (5,3,1), so ( 1 , 4 ) (1,4) (1,4) is a good pair.
3
1 2 1
0
There may be cases where no good pairs exist.
9
10 10 1 3 3 7 2 2 5
3
具体见文后视频。
#include
#define lowbit(x) x & -x
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
const int SIZE = 1e5 + 10;
int N;
int A[SIZE];
std::vector<int> P[20];
struct Fenwick
{
int Tree[SIZE];
Fenwick() { memset(Tree, 0, sizeof Tree); }
void Add(int x, int d) { for (int i = x; i <= N; i += lowbit(i)) Tree[i] = max(Tree[i], d); }
int Max(int x)
{
int Result = 0;
for (int i = x; i; i -= lowbit(i))
Result = max(Result, Tree[i]);
return Result;
}
}Cnt;
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> N;
for (int i = 1; i <= N; i ++)
cin >> A[i], P[A[i]].push_back(i);
int L = 0, R = N + 1, Result = 0;
vector<PII> Seg;
for (int i = 2; i < N; i ++)
for (int j = -A[i] + 1; j < A[i]; j ++)
{
if (!P[A[i] + j].size() || !P[A[i] - j].size()) continue;
auto it = lower_bound(P[A[i] + j].begin(), P[A[i] + j].end(), i);
if (it == P[A[i] + j].begin()) continue;
int Left = *( -- it);
it = upper_bound(P[A[i] - j].begin(), P[A[i] - j].end(), i);
if (it == P[A[i] - j].end()) continue;
int Right = *it;
Seg.push_back({Left, Right});
Cnt.Add(Right, Left);
}
for (int r = 1; r <= N; r ++)
{
int L = Cnt.Max(r);
Result += L;
}
cout << Result << endl;
return 0;
}
For a sequence X X X composed of a finite number of non-negative integers, we define m e x ( X ) \mathrm{mex}(X) mex(X) as the smallest non-negative integer not in X X X. For example, m e x ( ( 0 , 0 , 1 , 3 ) ) = 2 , m e x ( ( 1 ) ) = 0 , m e x ( ( ) ) = 0 \mathrm{mex}((0,0, 1,3)) = 2, \mathrm{mex}((1)) = 0, \mathrm{mex}(()) = 0 mex((0,0,1,3))=2,mex((1))=0,mex(())=0.
You are given a sequence S = ( S 1 , … , S N ) S=(S_1,\ldots,S_N) S=(S1,…,SN) of length N N N where each element is 0 0 0 or 1 1 1.
Find the number, modulo 998244353 998244353 998244353, of sequences A = ( A 1 , A 2 , … , A N ) A=(A_1,A_2,\ldots,A_N) A=(A1,A2,…,AN) of length N N N consisting of integers between 0 0 0 and M M M, inclusive, that satisfy the following condition:
For each i ( 1 ≤ i ≤ N ) i (1\leq i\leq N) i(1≤i≤N), A i = m e x ( ( A 1 , A 2 , … , A i − 1 ) ) A_i = \mathrm{mex}((A_1,A_2,\ldots,A_{i-1})) Ai=mex((A1,A2,…,Ai−1)) if S i = 1 S_i=1 Si=1, and A i ≠ m e x ( ( A 1 , A 2 , … , A i − 1 ) ) A_i \neq \mathrm{mex}((A_1,A_2,\ldots,A_{i-1})) Ai=mex((A1,A2,…,Ai−1)) if S i = 0 S_i=0 Si=0.
1 ≤ N ≤ 5000 1 \leq N \leq 5000 1≤N≤5000
0 ≤ M ≤ 1 0 9 0 \leq M \leq 10^9 0≤M≤109
S i S_i Si is 0 0 0 or 1 1 1.
All input numbers are integers.
The input is given from Standard Input in the following format:
N N N M M M
S 1 S_1 S1 … \ldots … S N S_N SN
Print the answer.
4 2
1 0 0 1
4
The following four sequences satisfy the conditions:
( 0 , 0 , 0 , 1 ) (0,0,0,1) (0,0,0,1)
( 0 , 0 , 2 , 1 ) (0,0,2,1) (0,0,2,1)
( 0 , 2 , 0 , 1 ) (0,2,0,1) (0,2,0,1)
( 0 , 2 , 2 , 1 ) (0,2,2,1) (0,2,2,1)
10 1000000000
0 0 1 0 0 0 1 0 1 0
587954969
Be sure to find the count modulo 998244353 998244353 998244353.
具体见文后视频。
#include
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
const int SIZE = 3e5 + 10;
int N;
int A[SIZE], Next[SIZE];
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
memset(Next, -1, sizeof Next);
cin >> N;
for (int i = 1; i <= N; i ++)
{
cin >> A[i];
if (A[i] == -1) Next[0] = i;
else Next[A[i]] = i;
}
for (int i = 0; Next[i] != -1; i = Next[i])
cout << Next[i] << " ";
return 0;
}
Atcoder Regular Contest 170(A - C 题讲解)
最后祝大家早日