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=S1S2SN 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 1i<j<kN 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 3N2×105
N is an integer.
A i ∈ 0 , 1 , 2 A_i∈{0,1,2} Ai0,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 A1A2AN
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;
}
posted @ 2023-07-12 10:56  whznfy  阅读(16)  评论(0)    收藏  举报  来源