2023.7.1 Atcoder 308beginner E题
2023.7.1ATcoder308(Beginner)E题
E - MEX
Problem Statement
You are given a length- N N N sequence A = ( A 1 , A 2 , … , A N ) A=(A_1,A_2,…,A_N) A=(A1,A2,…,AN) consisting of 0, 1, and 2, and a length- N N N string S = S 1 S 2 … S N S=S_1S_2…S_N S=S1S2…SN consisting of M, E, and X.
Find the sum of m e x ( A i , A j , A k ) mex(A_i,A_j,A_k) mex(Ai,Aj,Ak) over all tuples of integers ( i , j , k ) (i,j,k) (i,j,k) such that 1 ≤ i < j < k ≤ N 1≤i<j<k≤N 1≤i<j<k≤N and S i S j S k S_ iS_jS_k SiSjSk= MEX. Here, m e x ( A i , A j , A k ) mex(A_i,A_j,A_k) mex(Ai,Aj,Ak) denotes the minimum non-negative integer that equals neither A i , A j , n o r A k A_i,A_j, nor A_k Ai,Aj,norAk.
Constraints
3 ≤ N ≤ 2 × 1 0 5 3≤N≤2×10^5 3≤N≤2×105
N is an integer.
A i ∈ 0 , 1 , 2 A_i∈{0,1,2} Ai∈0,1,2
S S S is a string of length
N N N consisting of M, E, and X.
Input
The input is given from Standard Input in the following format:
N N N
A 1 A 2 … A N A_1 A _2 … A _N A1A2…AN
S S S
Output
Print the answer as an integer.
大致梳理题意:给定
n
n
n 个整数(0,1,或2)和
n
n
n 个字符(M,E,或X),定义一个
m
e
x
mex
mex 函数要求满足
S
i
S
j
S
k
S_ iS_jS_k
SiSjSk= MEX,它的值为不等于
A
i
A
j
A
k
A_iA_j A_k
AiAjAk的最小非负整数。然后输出所有值的和。
我们举一个样例:
4
1 1 0 2
MEEX
所有组成MEX的方案共有两个:
1.
i
=
1
,
j
=
2
,
k
=
4
i=1,j=2,k=4
i=1,j=2,k=4时,
m
e
x
(
A
1
,
A
2
,
A
4
)
mex(A_1,A_2,A_4)
mex(A1,A2,A4)=
m
e
x
(
1
,
1
,
2
)
mex(1,1,2)
mex(1,1,2)=0
2.
i
=
1
,
j
=
3
,
k
=
4
i=1,j=3,k=4
i=1,j=3,k=4时,
m
e
x
(
A
1
,
A
3
,
A
4
)
mex(A_1,A_3,A_4)
mex(A1,A3,A4)=
m
e
x
(
1
,
0
,
2
)
mex(1,0,2)
mex(1,0,2)=3
所以和为3。
大家想一想,如果只有统计ME呢?
我的想法是从前向后挨个枚举,统计当前
M
M
M 的数量(当然,因为数字的不同,需要分为
m
0
,
m
1
,
m
2
m0,m1,m2
m0,m1,m2 来记),碰到
E
E
E 就配对并且计算。
MEX同理。
从前向后挨个枚举,统计当前
M
M
M 的数量(当然,因为数字的不同,需要分为
m
0
,
m
1
,
m
2
m0,m1,m2
m0,m1,m2 来记),碰到
E
E
E 就利用乘法原理计算
M
E
ME
ME 的数量(要分为
m
e
00
,
m
e
01
,
m
e
02
,
m
e
10
,
m
e
11
,
.
.
.
,
m
e
22
me00,me01,me02,me10,me11,...,me22
me00,me01,me02,me10,me11,...,me22 共9个,所以避免麻烦,我选择数组存储)。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,a[200000],m[3],me[3][3],ans;
string s;
signed main(){
cin>>n;
for(int i=0;i<n;++i)
cin>>a[i];
cin>>s;
for(int i=0;i<n;++i){
if(s[i]=='M')++m[a[i]];//分类统计M的数量
else if(s[i]=='E'){
me[0][a[i]]+=m[0];
me[1][a[i]]+=m[1];
me[2][a[i]]+=m[2];
}//分类统计ME的数量
else{
if(a[i]==0)ans+=me[0][0]+2*me[0][1]+2*me[1][1]+3*me[1][2]+me[2][2]+me[2][0]+2*me[1][0]+3*me[2][1]+me[0][2];
else if(a[i]==1)ans+=2*me[0][0]+2*me[0][1]+3*me[2][0]+2*me[1][0]+3*me[0][2];
else ans+=me[0][0]+3*me[0][1]+me[2][0]+3*me[1][0]+me[0][2];
}//计算
}
cout<<ans<<endl;
return 0;
}

浙公网安备 33010602011771号