LOJ#2343. 「JOI 2016 Final」集邮比赛 2
题目地址
题解
首先处理出\(f[i]\)表示以当前位置开头(J,O,I)的合法方案数。这个显然可以\(O(n)\)处理出来。然后考虑在每个位置插入三种数。
在位置i插入J:显然对于i后面的所有\(f[j](i<j,s[j]=O)\)有多一个转移点,对\(f[j]\)做个后缀和即可。
在位置i插入O:对于i前面的J,和i后面的I,显然都多一个中转点,于是对J做前缀和,I做后缀和,枚举插入位置i,左右两边相乘取\(\max\)即可。
在位置i插入I:对于i前面的每个O提供了一个转移点,对于前面的每个J(设位置为x),提供了\([x+1,i-1]\)内O的个数的贡献。不难发现这个东西是单调递增的。所以维护个计数器,记录当前J的个数每次遇到一个O对当前统计的答案增加量\(delta\)加上J的个数即可。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 100010;
int n;
char s[N];
ll f[N], cnt[3], sl[N][3], sr[N][3], sf[N];
int idx(char c) {
if(c == 'J') return 0;
if(c == 'O') return 1;
return 2;
}
int main() {
scanf("%d%s", &n ,s + 1);
for(int i = n; i; --i) {
if(s[i] == 'I') f[i] = 1;
else f[i] = cnt[idx(s[i]) + 1];
cnt[idx(s[i])] += f[i];
}
cnt[0] = cnt[1] = cnt[2] = 0;
for(int i = 1; i <= n; ++i) {
for(int j = 0; j < 3; ++j) sl[i][j] = sl[i - 1][j];
sl[i][idx(s[i])]++;
}
for(int i = n; i; --i) {
for(int j = 0; j < 3; ++j) sr[i][j] = sr[i + 1][j];
sr[i][idx(s[i])]++;
sf[i] = sf[i + 1];
if(s[i] == 'O') sf[i] += f[i];
}
ll A = 0, ans = 0;
for(int i = 1; i <= n; ++i) if(s[i] == 'J') A += f[i];
// J
for(int i = 0; i <= n; ++i) ans = max(ans, A + sf[i + 1]);
// O
for(int i = 0; i <= n; ++i) {
ans = max(ans, A + sl[i][0] * sr[i + 1][2]);
}
// I
ll tot = 0;
for(int i = 1; i <= n; ++i) {
if(s[i] != 'I') {
if(s[i] == 'O') tot += cnt[0];
cnt[idx(s[i])]++;
}
ans = max(ans, A + tot);
}
printf("%lld\n", ans);
}
LOJ#2343. 「JOI 2016 Final」集邮比赛 2的更多相关文章
- LOJ#2351. 「JOI 2018 Final」毒蛇越狱
LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...
- LOJ#2764. 「JOI 2013 Final」JOIOI 塔
题目地址 https://loj.ac/problem/2764 题解 真的想不到二分...不看tag的话... 考虑二分答案转化为判定问题,那么问题就变成了能不能组合出x个JOI/IOI,考虑贪心判 ...
- loj 3014「JOI 2019 Final」独特的城市
loj 我本来是直接口胡了一个意思一样的做法的,但是因为觉得有点假+实现要用并查集(?)就卡了好一会儿... 对于一个点\(x\)来说,独特的点一定在它的最长链上,如果有独特的点不在最长链上,那么最长 ...
- loj 2759「JOI 2014 Final」飞天鼠
loj 这题有在一棵树上上升或者下降的操作,稍加分析后可以发现上升操作如果不是一定要做(指高度不足以到下一棵树或者是最后到达\(n\))就不做,下降操作也是如果不是一定要做(指到达下一棵树时高度过高) ...
- loj 2336「JOI 2017 Final」绳
loj 首先,所有位置最多被染色一次,因为要染多次的话,还不如一开始就染成最终的颜色.并且你可以一开始就染好色 因为最终长度为2,那么如果染完后这个序列可以被折完,那么首先最多只有两种颜色,还有就是要 ...
- 「JOI 2016 Final」断层
嘟嘟嘟 今天我们模拟考这题,出的是T3.实在是没想出来,就搞了个20分暴力(还WA了几发). 这题关键在于逆向思维,就是考虑最后的\(n\)的个点刚开始在哪儿,这样就减少了很多需要维护的东西. 这就让 ...
- Luogu P5103 「JOI 2016 Final」断层 树状数组or线段树+脑子
太神仙了这题... 原来的地面上升,可以倒着操作(时光倒流),转化为地面沉降,最后的答案就是每个点的深度. 下面的1,2操作均定义为向下沉降(与原题意的变换相反): 首先这个题目只会操作前缀和后缀,并 ...
- loj#2334 「JOI 2017 Final」JOIOI 王国
分析 二分答案 判断左上角是否满足 为了覆盖所有范围 我们依次把右下角,左上角,右上角移动到左上角 代码 #include<bits/stdc++.h> using namespace s ...
- loj#2333 「JOI 2017 Final」准高速电车
分析 我们发现到达一个点一定是先快车再准快车再慢车 于是快车将1-n分为多个区间 每次取出每个区间当前能到达的点的数量 选剩余时间贡献最大的的一个取得贡献并且再能到达的最远点建立准快车 代码 #inc ...
随机推荐
- mysql新增用户无法授权!? 解决方案
先上解决方法 :) 创建用户cat 密码 CREATE USER '; 修改user表中的注册用户cat update user set host='%' where user='cat'; 授权: ...
- kafka删除topic及其相关数据
1.删除kafka存储目录(server.properties文件log.dirs配置,默认为"/tmp/kafka-logs")相关topic目录 2.Kafka 删除topic ...
- [转] spring-boot集成swagger2
经测,spring-boot版本使用1.5.2+时需使用springfox-swagger2版本2.5+(spring-boot 1.2 + springfox-swagger2 2.2 在未扫描ja ...
- 常见GC算法,CMS以及G1的垃圾回收过程,CMS的各个阶段哪两个是Stop the world的,CMS会不会产生碎片,G1的优势。
常见GC算法 在C/C++中是由程序员自己去申请.管理和释放内存的,因此没有GC的概念.而在Java中,专门有一个用于垃圾回收的后台线程来进行监控.扫描,自动将一些无用的内存进行释放.下面介绍几种常见 ...
- Opencv之漫水填充效果
下面是opencv的漫水填充效果代码 这篇文章仅限个人的笔记 没有详细的注释 放代码 这是简单的示范 int main()//*******************简单的漫水填充算法实例 { Vide ...
- C++ 工程师养成 每日一题third (子数列排序)
题目: 定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的.牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数 ...
- BJFU-217-基于链式存储结构的图书信息表的逆序存储
这道题可以用头插法创建列表,然后正常输出: #include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struc ...
- PAT(B) 1030 完美数列 - C语言 - 滑动窗口 & 双指针
题目链接:1030 完美数列 (25 point(s)) 给定一个正整数数列,和正整数 \(p\),设这个数列中的最大值是 \(M\),最小值是 \(m\),如果 \(M≤mp\),则称这个数列是完美 ...
- CF891E Lust 生成函数
传送门 设在某一次操作之后的\(a\)数组变为了\(a'\)数组,那么\(\prod\limits_{i \neq x} a_i = \prod a_i - \prod a_i'\).那么就不难发现我 ...
- 在IOS10系统中无法定位问题
果是非https网页,在http协议下通过html5原生定位接口会返回错误,也就是无法正常定位到用户的具体位置,而已经支持https的网站则不会受影响. 目前提供的解决方案: 1.将网站的http设置 ...