首页 > 其他分享 >【atcoder beginner 308E - MEX】

【atcoder beginner 308E - MEX】

时间:2023-07-01 22:34:48浏览次数:57  
标签:atcoder arr y0 308E new int ans Integer MEX

  • 前缀和
  • 二分查找
  • 打表枚举
  • 代码如下
  • import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.StreamTokenizer;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
    
        public static Integer[] dp(int[] arr, String s,int t,char ch) {
            List<Integer> ans = new ArrayList<>();
            if (arr[0] == t && s.charAt(0) == ch) {
                ans.add(1);
            } else {
                ans.add(0);
            }
            for (int i = 1; i < arr.length; i++) {
                if (arr[i] == t && s.charAt(i) == ch) {
                    ans.add(ans.get(i - 1) + 1);
                } else {
                    ans.add(ans.get(i - 1));
                }
            }
            return ans.toArray(new Integer[ans.size()]);
        }
    
        public static void main(String[] args) throws IOException {
            StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
            in.nextToken();
            int n = (int) in.nval;
            int[] arr = new int[n];
            for (int i = 0; i < arr.length; i++) {
                in.nextToken();
                arr[i] = (int) in.nval;
            }
            in.nextToken();
            String s = in.sval;
            Integer[] mlist = build(s, 'M');
            Integer[] elist = build(s, 'E');
            Integer[] xlist = build(s, 'X');
    
            Integer[] hm0 = dp(arr, s,0,'M');
            Integer[] hm1 = dp(arr, s,1,'M');
            Integer[] hm2 = dp(arr,s, 2,'M');
    
            Integer[] hx0 = dp(arr, s,0,'X');
            Integer[] hx1 = dp(arr, s,1,'X');
            Integer[] hx2 = dp(arr,s, 2,'X');
    
    
            long ans = 0;
            for (int i = 0; i < elist.length; i++) {
                int j = upperlound(mlist, elist[i]);
                int p = upperlound(xlist, elist[i]);
    
                if (j == 0) {
                    continue;
                }
                if (p == xlist.length) {
                    continue;
                }
                j = j - 1;
    
                int t = mlist[j];
    
                int x0 = hm0[t];
                int x1 = hm1[t];
                int x2 = hm2[t];
    
                int k = xlist[p];
    
                int y0 = k > 0 ? hx0[n - 1] - hx0[k - 1] : hx0[n - 1];
                int y1 = k > 0 ? hx1[n - 1] - hx1[k - 1] : hx1[n - 1];
                int y2 = k > 0 ? hx2[n - 1] - hx2[k - 1] : hx2[n - 1];
    
                int z = arr[elist[i]];
    
                if (z == 2) {
                    ans += 1l*x0*(y0 + y2 + 3 * y1);
                    ans += 3l*x1*y0;
                    ans += 1l* x2*y0;
                }
                else if( z == 1){
                    ans += 1l*x0*(2*y0+2*y1+3*y2);
                    ans += 2l*x1*y0;
                    ans += 3l*x2*y0;
                }
                else{
                    ans += 1l*x0*(y0+2*y1+y2);
                    ans += 1l*x1*(2*y0+2*y1+3*y2);
                    ans += 1l*x2*(y0+3*y1+y2);
                }
    
            }
    
            System.out.println(ans);
        }
    
    
        /**
         * @param arr
         * @param value
         * @return 》 value的第一个坐标位置,如果不存在,那么就是arr.length;
         */
        public static int upperlound(Integer[] arr, int value) {
            int low = 0;
            int high = arr.length;
            while (low < high) {
                int mid = low + (high - low) / 2;
                if (arr[mid] <= value) {
                    low = mid + 1;
                } else {
                    high = mid;
                }
            }
            return low;
        }
    
        public static Integer[] build(String str, char ch) {
            List<Integer> list = new ArrayList<>();
            for (int i = 0; i < str.length(); i++) {
                if (str.charAt(i) == ch) {
                    list.add(i);
                }
            }
            return list.toArray(new Integer[list.size()]);
        }
    
    
    }

     

标签:atcoder,arr,y0,308E,new,int,ans,Integer,MEX
From: https://www.cnblogs.com/fishcanfly/p/17520073.html

相关文章

  • AtCoder Grand Contest 021 E Ball Eat Chameleons
    洛谷传送门AtCoder传送门容易发现一个变色龙是红色当且仅当,设\(R\)为红球数量,\(B\)为蓝球数量,那么\(R\geB\)或\(R=B\)且最后一个球是蓝球。考虑如何判定一个颜色序列是否可行。考虑贪心。若\(R<B\)显然不行。若\(R\geB+n\),每个变色龙都可以分到比蓝球......
  • AtCoder Beginner Contest 307(E,F,G)
    AtCoderBeginnerContest307(E,F,G)E(dp)E这个题大意就是我们需要组成一个长度为\(n\)的数组,满足两个相邻的数字不可以相等,其中,\(a_1\)和\(a_n\)也是相邻的,我们可以选择的数字为\(0\)到\(m-1\),问最后有多少种不同的组成方式满足以上条件。题目大意很简单,就是有点难想,如果\(a......
  • Atcoder Beginner Contest 251-260 EFG
    #251E-TakahashiandAnimals*1261,*环形dpACLink考虑环形dp,对于使用或者不使用\(1\)号饲料分别dp,然后取最小值即可。......
  • AtCoder Beginner Contest(abc) 297
    B-chess960题目大意给定一串字符串,里面一定包含2个'B',2个'R',1个'K',问该字符串是否满足以下两个条件,一是两个'B'所在位置奇偶性不同;二是'K'的位置在两个'R'之间解题思路签到题不多嗦了;神秘代码#include<bits/stdc++.h>#defineintlonglongusi......
  • AtCoder Beginner Contest 296 Ex Unite
    洛谷传送门AtCoder传送门不错的dp。考虑按行从上往下dp,并且把列的连通状态塞进dp状态里面。实际上就是塞一个并查集。判状态合法性就是当一个竖的全黑长条结束后,有没有跟别的列连起来。code//Problem:Ex-Unite//Contest:AtCoder-AtCoderBeginnerContest29......
  • AtCoder Beginner Contest 227 H Eat Them All
    洛谷传送门AtCoder传送门好奇特的题。考虑显式建图,那么这是一个\(9\)个结点,\(12\)条边的图,需要找到一条回路使得第\(i\)个点被经过\(a_i\)次。首先会有一个基本思路:先求出每条边经过的次数,然后每条边复制这么多次即可直接构造欧拉回路。其中每条边经过次数的限制就是,......
  • AtCoder Beginner Contest 306(ABC 306) E~F补题
    E题目大意给定数字$k$,规定数组$A$的函数$f(A)$:$A$数组前$k$大数字的和如$A=[1,3,7,~4]$,$k=2$,则$f(A)=7+4=11$现在给定最大数组长度$n$,有$q$组操作,每次将第$x$个数字修改为$y$,输出每次操作后的$f(A)$其中$0<k\leqn\leq5\times10^5,~q\leq5\times......
  • AtCoder Beginner Contest 228 G Digits on Grid
    洛谷传送门AtCoder传送门?这啥啊,不会。考虑行和列分别作为左部点和右部点建二分图(实际上这个建图只是辅助理解,不需要显式建图),每个左部点和每个右部点,边权为格子中的数。容易想到一个dp,设\(f_{i,j}\)为走了\(i\)步,当前在点\(j\),走过的所有边权组成的不同整数的数量。但......
  • AtCoder Beginner Contest 072
    A-Sandglass2#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){inta,b;cin>>a>>b;cout<<max(a-b,0ll);return0;}B-OddString#include<bits/stdc++.h>......
  • AtCoder Beginner Contest 238 Ex Removing People
    洛谷传送门AtCoder传送门考虑期望转计数,方案数显然是\(n!\)(第\(i\)次操作有\(n-i+1\)个人可供选择),所以问题转化为求所有方案的代价之和。考虑倒着做,变成先放一个人,然后依次放\(n-1\)个人,每次放的这个人可以让左边的人的\(S\)变成R,代价是他与他左边的人的距离,......