• 前缀和
  • 二分查找
  • 打表枚举
  • 代码如下
  • 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 beginner 308E - MEX】的更多相关文章

  1. 【AtCoder Beginner Contest 181】A~F题解

    越学越菜系列 于2020.11.2,我绿了(错乱) A - Heavy Rotation 签到题,奇数Black,偶数White. code: #include<bits/stdc++.h> ...

  2. 【AtCoder Beginner Contest 074 D】Restoring Road Network

    [链接]h在这里写链接 [题意] 给你任意两点之间的最短路. 让你求出原图. 或者输出原图不存在. 输出原图的边长总和的最小值. [题解] floyd算法. 先在原有的矩阵上. 做一遍floyd. 如 ...

  3. 【AtCoder Beginner Contest 074 C】Sugar Water

    [链接]h在这里写链接 [题意] 让你在杯子里加糖或加水. (4种操作类型) 糖或水之间有一定关系. 糖和水的总量也有限制. 问你糖水浓度的最大时,糖和糖水的量. [题解] 写个dfs就好. 每次有4 ...

  4. 【AtCoder Beginner Contest 074 B】Collecting Balls (Easy Version)

    [链接]h在这里写链接 [题意] 看懂题目之后就会发现是道大水题. [题解] 在这里写题解 [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/stdc++.h&g ...

  5. 【AtCoder Beginner Contest 074 A】Bichrome Cells

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] 在这里写题解 [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/stdc++.h> using n ...

  6. 【AtCoder Regular Contest 082】Derangement

    [链接]点击打开链接 [题意] 在这里写题意 [题解] 贪心. 连续一块的p[i]==i的话,对答案的贡献就应该为(这个连续块的长度+1)/2; 长度为1的也正确. (也即两两相邻的互换位置.) [错 ...

  7. 【AtCoder ABC 075 D】Axis-Parallel Rectangle

    [链接] 我是链接,点我呀:) [题意] 让你找到一个各边和坐标轴平行的矩形.使得这个矩形包含至少K个点. 且这个矩形的面积最小. [题解] 把所有的"关键点""都找出来 ...

  8. 【AtCoder ABC 075 C】Bridge

    [链接] 我是链接,点我呀:) [题意] 让你求出桥的个数 [题解] 删掉这条边,然后看看1能不能到达其他所有的点就可以了 [代码] #include <bits/stdc++.h> us ...

  9. 【AtCoder ABC 075 B】Minesweeper

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟,把#换成1 八个方向加一下就好. [代码] #include <bits/stdc++.h> using name ...

  10. 【AtCoder ABC 075 A】One out of Three

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用map轻松搞定 [代码] #include <bits/stdc++.h> using namespace std; ...

随机推荐

  1. 双端队列(deque)--python

    Python中的双端队列(deque)是一种特殊的数据结构,它允许在队列的两端进行插入和删除操作12.双端队列可以看成栈和队列的结合3.在Python中,我们可以使用collections模块中的de ...

  2. Java并发(五)----线程常见方法总结

    常见方法 方法名 static 功能说明 注意 start()   启动一个新线程,在新的线程运行 run 方法中的代码 start 方法只是让线程进入就绪,里面代码不一定立刻运行(CPU 的时间片还 ...

  3. 关于大数乘法的数组类型问题(int 还是char)

    可以知道在处理高精度乘法的时候,我们是不考虑当场进位的,在所有位数都模拟完竖式乘法后才进行逐位进位,这就要求存储每个位的数组保证不会爆掉溢出 众所周知char类型最多只能存储到255,非常非常容易溢出 ...

  4. 使用XAG配置GoldenGate在RAC集群环境中的高可用

    背景:本文是根据实际客户测试需求整理,因为客户OGG所在环境只有GI集群,数据库部署在其他位置,所以会有一些差异,但核心思路一致,已完全测试通过,整理出来供大家参考. 1.前期准备 2.创建ACFS文 ...

  5. Flink-SQL数据去重

    Flink去重语句 您可以通过多种方式实现去重需求,例如FIRST_VALUE.LAST_VALUE和DISTINCT等.本文为您介绍如何使用TopN方法实现去重,以及使用过程中的注意事项. 去重的方 ...

  6. Ubuntu20.04和22.04离线安装PostgreSQL14

    今天安装 Postgresql14 遇到一个问题, 目标服务器只有内网, 内网提供标准的apt仓库, 但是因为不能连接外网, 所以没法添加第三方仓库, 这样安装pg14就成了问题. 从pg的官网看, ...

  7. 使用synchronized对并发性的影响

    1 前言 非静态方法的同步锁是当前对象(this)(对象锁) 静态方法的同步锁是当前类的字节码(类锁) 不同的锁之间能并发 2 同一对象内 本节主类与资源类如下: class Resorce{ //资 ...

  8. Set与WeakSet

    Set与WeakSet Set对象允许存储任何类型的唯一值,无论是原始值或者是对象引用,Set对象中的值不会重复. WeakSet对象允许存储对象弱引用的唯一值,WeakSet对象中的值同样不会重复, ...

  9. SpringCloud 注册中心Zookeeper实战

    介绍 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...

  10. [BUUCTF][WEB][极客大挑战 2019]PHP 1

    打开靶机URL 看到字面提示 因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯不愧是我!!! 说明该网站有备份,说不定放在了Http服务器的某个目录下 那么这里我们可以用dirsearc ...