首页 > 其他分享 >[典·三元组]

[典·三元组]

时间:2023-07-02 11:35:36浏览次数:40  
标签:ch int cin 三元组 情况 统计

题目:MEX 来源:AtCoder Beginner Contest 308

根据例1可以先进行判断,如果根据E的不同情况进行统计的话方便入手

1.从左到右统计M的{0,1,2}的情况

2.从右到左统计X的{0,1,2}的情况

3.判断当前s[i]为‘E’的情况下,并且对应的a[i]={0,1,2}三种情况相乘的个数(乘的是三元组的没出现的最小非负整数)(太典了)

const int N = 2e6 + 10;
int n, m;
LL ans;
int a[N], M[N][3], E[N][3], X[N][3];
string s;
void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    cin >> s;
    for (int i = 1; i <= n; i++)
    {
        char ch = s[i - 1];
        M[i][0] = M[i - 1][0];
        M[i][1] = M[i - 1][1];
        M[i][2] = M[i - 1][2];
        if (ch == 'M')M[i][a[i]]++;
    }
    for (int i = n; i >= 1; i--)
    {
        char ch = s[i - 1];
        X[i][0] = X[i + 1][0];
        X[i][1] = X[i + 1][1];
        X[i][2] = X[i + 1][2];
        if (ch == 'X')X[i][a[i]]++;
    }
    for (int i = 1; i <= n; i++)
    {
        char ch = s[i - 1];
        if (ch == 'E')
        {
            if (a[i] == 0)
            {
                ans += (LL)M[i][0] * X[i][0]; //M=0,X=0,E=a[i]=0;
                ans += (LL)M[i][0] * X[i][1] * 2;
                ans += (LL)M[i][0] * X[i][2];

                ans += (LL)M[i][1] * X[i][0] * 2;
                ans += (LL)M[i][1] * X[i][1] * 2;
                ans += (LL)M[i][1] * X[i][2] * 3;

                ans += (LL)M[i][2] * X[i][0];
                ans += (LL)M[i][2] * X[i][1] * 3;
                ans += (LL)M[i][2] * X[i][2];
            }
            else if (a[i] == 1)
            {
                ans += (LL)M[i][0] * X[i][0] * 2;
                ans += (LL)M[i][0] * X[i][1] * 2;
                ans += (LL)M[i][0] * X[i][2] * 3;

                ans += (LL)M[i][1] * X[i][0] * 2;
                ans += (LL)M[i][1] * X[i][1] * 0;
                ans += (LL)M[i][1] * X[i][2] * 0;

                ans += (LL)M[i][2] * X[i][0] * 3;
                ans += (LL)M[i][2] * X[i][1] * 0;
                ans += (LL)M[i][2] * X[i][2] * 0;
            }
            else if (a[i] == 2)
            {
                ans += (LL)M[i][0] * X[i][0] * 1;
                ans += (LL)M[i][0] * X[i][1] * 3;
                ans += (LL)M[i][0] * X[i][2] * 1;

                ans += (LL)M[i][1] * X[i][0] * 3;
                ans += (LL)M[i][1] * X[i][1] * 0;
                ans += (LL)M[i][1] * X[i][2] * 0;

                ans += (LL)M[i][2] * X[i][0] * 1;
                ans += (LL)M[i][2] * X[i][1] * 0;
                ans += (LL)M[i][2] * X[i][2] * 0;
            }
        }
    }
    cout << ans << endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    while (t--)
    {
        solve();
    }
    return 0;
}

 

标签:ch,int,cin,三元组,情况,统计
From: https://www.cnblogs.com/crismiao/p/17520524.html

相关文章

  • 2023.6.13 数组中不等三元组的数目
    直接的思路是三重循环\(O(n^3)\)解决,由于数据范围是\(n\leq100\),所以\(n^3\leq10^6\)可以过。如果想稍微优化一下的话,可以考虑下面两种思路,都是类似的:排序,排完序后相同的元素会聚集到一起,假设他们聚集在了区间\([i,j]\)内。那\([0,i-1]\)这一部分区间和\([j+1,n]\)......
  • 力扣---2475. 数组中不等三元组的数目
    给你一个下标从0开始的正整数数组nums。请你找出并统计满足下述条件的三元组(i,j,k)的数目:0<=i<j<k<nums.lengthnums[i]、nums[j]和nums[k]两两不同。换句话说:nums[i]!=nums[j]、nums[i]!=nums[k]且nums[j]!=nums[k]。返回满足上述条件三元组的数目......
  • HDU3939(毕达哥拉斯三元组的解)
    对于方程:,满足条件:x,y,z两两互素的正整数解为: ,其中m>n>0,gcd(m,n)=1,m,n一奇一偶。典型题目:POJ1305,HDU3939 对于POJ1305很简单,下面重点来解析HDU3939题。题目:SticksandRightTriangle#include<iostream>#include<string.h>#include<algorithm>#include<stdio.h>#include&l......
  • 982. 按位与为零的三元组
    题目链接:982.按位与为零的三元组方法一:枚举(超时)解题思路直接枚举\(i,j,k\)分别取\([0,n-1]\),判断\((\)\(nums[i]\)&\(nums[j]\)&\(nums[k]\)\()\)\(==\)\(0\)。由于本题的数量级较大\(n=1000\),\(n^3=10^9\),会导致暴力枚举超时。注意:\(==\)的优先级大于\(&\),......
  • 算术三元组的数目
    给你一个下标从0开始、严格递增的整数数组nums和一个正整数diff。如果满足下述全部条件,则三元组(i,j,k)就是一个算术三元组:i<j<k,nums[j]-nums[i]==diff且nums[k]-nums[j]==diff返回不同算术三元组的数目。示例1:输入:nums=[0,1,4,6,7,10],......
  • 递增三元组
    此题考查暴力,二分此题未AC用了两种方法解题dfsbinarySearchdfspackagelanqiao;importjava.util.Scanner;publicclassN172{staticint[][]m;......
  • 递增三元组
    递增三元组[蓝桥杯2018省B]递增三元组题目描述给定三个整数数组\(A=[A_1,A_2,\cdots,A_N]\),\(B=[B_1,B_2,\cdots,B_N]\),\(C=[C_1,C_2,\cdots,C_N]\)。......
  • 982. 按位与为零的三元组 (Hard)
    问题描述982.按位与为零的三元组(Hard)给你一个整数数组nums,返回其中按位与三元组的数目。按位与三元组是由下标(i,j,k)组成的三元组,并满足下述全部条件:0......
  • 982. 安位与为 0 的三元组
    题目链接: 982.按位与为零的三元组-力扣(LeetCode)    按位与为零的三元组-按位与为零的三元组-力扣(LeetCode) ......
  • 力扣---982. 按位与为零的三元组
    给你一个整数数组nums,返回其中按位与三元组的数目。按位与三元组是由下标(i,j,k)组成的三元组,并满足下述全部条件:   0<=i<nums.length   0<=j<nu......