【atcoder beginner 308E - 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 beginner 308E - MEX】的更多相关文章
- 【AtCoder Beginner Contest 181】A~F题解
越学越菜系列 于2020.11.2,我绿了(错乱) A - Heavy Rotation 签到题,奇数Black,偶数White. code: #include<bits/stdc++.h> ...
- 【AtCoder Beginner Contest 074 D】Restoring Road Network
[链接]h在这里写链接 [题意] 给你任意两点之间的最短路. 让你求出原图. 或者输出原图不存在. 输出原图的边长总和的最小值. [题解] floyd算法. 先在原有的矩阵上. 做一遍floyd. 如 ...
- 【AtCoder Beginner Contest 074 C】Sugar Water
[链接]h在这里写链接 [题意] 让你在杯子里加糖或加水. (4种操作类型) 糖或水之间有一定关系. 糖和水的总量也有限制. 问你糖水浓度的最大时,糖和糖水的量. [题解] 写个dfs就好. 每次有4 ...
- 【AtCoder Beginner Contest 074 B】Collecting Balls (Easy Version)
[链接]h在这里写链接 [题意] 看懂题目之后就会发现是道大水题. [题解] 在这里写题解 [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/stdc++.h&g ...
- 【AtCoder Beginner Contest 074 A】Bichrome Cells
[链接]h在这里写链接 [题意] 在这里写题意 [题解] 在这里写题解 [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/stdc++.h> using n ...
- 【AtCoder Regular Contest 082】Derangement
[链接]点击打开链接 [题意] 在这里写题意 [题解] 贪心. 连续一块的p[i]==i的话,对答案的贡献就应该为(这个连续块的长度+1)/2; 长度为1的也正确. (也即两两相邻的互换位置.) [错 ...
- 【AtCoder ABC 075 D】Axis-Parallel Rectangle
[链接] 我是链接,点我呀:) [题意] 让你找到一个各边和坐标轴平行的矩形.使得这个矩形包含至少K个点. 且这个矩形的面积最小. [题解] 把所有的"关键点""都找出来 ...
- 【AtCoder ABC 075 C】Bridge
[链接] 我是链接,点我呀:) [题意] 让你求出桥的个数 [题解] 删掉这条边,然后看看1能不能到达其他所有的点就可以了 [代码] #include <bits/stdc++.h> us ...
- 【AtCoder ABC 075 B】Minesweeper
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟,把#换成1 八个方向加一下就好. [代码] #include <bits/stdc++.h> using name ...
- 【AtCoder ABC 075 A】One out of Three
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用map轻松搞定 [代码] #include <bits/stdc++.h> using namespace std; ...
随机推荐
- 单片机 IAP 功能基础开发篇之APP升级(一)
引言 目的 主要介绍单片机 IAP 开发的设计思路,如何不使用下载烧录器的方式对单片机的程序进行升级,升级区域包括 bootloader 和用户程序的升级,升级方式有 UASRT 通信.CAN 通信和 ...
- Linux--Vi编辑命令(插入、替换、命令行模式、撤销)
1.进入插入模式(6个命令) [i] 从目前光标所在处插入 [I] 从目前光标 [a] 从当前光标所在的下一个字符处开始插入 [A] 从光标所在行的最后一个字符处开始插入 [o] 英文小写字母o,在目 ...
- [JVM] CPU缓存一致性协议
CPU缓存一致性协议 CPU高速缓存 CPU缓存是位于cpu和内存之间的临时数据交换器,它的容量比内存小的夺但是交换速度要比内存快得多,主要是为了解决cpu运行时的处理速度与内存读写速度不匹配的问题. ...
- 【scikit-learn基础】--模型持久化
模型持久化(模型保存与加载)是机器学习完成的最后一步.因为,在实际情况中,训练一个模型可能会非常耗时,如果每次需要使用模型时都要重新训练,这无疑会浪费大量的计算资源和时间. 通过将训练好的模型持久化到 ...
- typora beta版本 typora免费版 typora 0.11.18 下载
壹 ❀ 引 typora从1.0.0正式版开始就不再免费了,可能有一些开了自动检测更新的同学,在某次打开typora就看到了购买以及试用天数的弹窗,但typora正式之前的beta版依旧免费,这里就分 ...
- NC50505 二叉苹果树
题目链接 题目 题目描述 有一棵二叉苹果树,如果数字有分叉,一定是分两叉,即没有只有一个儿子的节点.这棵树共N个节点,标号1至N,树根编号一定为1. 我们用一根树枝两端连接的节点编号描述一根树枝的位置 ...
- Java容器及其常用方法汇总
1 概述 Java Collections 框架中包含了大量的接口及其实现类和操作它们的算法,主要包括列表(List).集合(Set).映射(Map),如下: 接口 实现类 数据结构 初始容量 加载因 ...
- Table布局
Table布局 <table>最常用的也是最正确的使用方法是制作表格,由于其对占据的空间有着划分的作用,便可以使用<table>来布局. 实例 实现一个简单的布局,将表格的bo ...
- pyhotn3.8 apt机器基础镜像构建
FROM python:3.8.10-slim RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/source ...
- golang常用库:gorilla/mux-http路由库使用
golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库/管理工具-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 一:gola ...