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 ...
随机推荐
- ThinkPHP3(命名空间、RBAC)
命名空间 当开发大型项目的时候,可以会需要成千上万的文件 面向对象通过命名空间来解决这个问题的. PHP命名空间是PHP5.3以后才出现的. 命名空间中可以出现:类,函数,常量 只有const定义的常 ...
- 洛谷P2048 [NOI2010]超级钢琴 题解
2019/11/14 更新日志: 近期发现这篇题解有点烂,更新一下,删繁就简,详细重点.代码多加了注释.就酱紫啦! 正解步骤 我们需要先算美妙度的前缀和,并初始化RMQ. 循环 \(i\) 从 \(1 ...
- Python入门 .变量 常量 基础数据类型 用户输入 流程控制语句 小练习题
# 2.name = input(“>>>”)通过代码来验证name变量是什么数据类型?--str name = input(">>>") pr ...
- PHP 使用 pdo 操作oracle数据库 报错
## SELECT UNID,NAME,NAME_XML WHERE UNID>=10 AND UNID<=15 ## 在10到15这5条数据中不为空数据php: symbol looku ...
- postgresql学习之安装篇
---恢复内容开始--- 安装方法: 1.可以使用操作系统自带的安装源 2.可以使用官网下载的源码进行安装 3.可以使用编译好的包入.run格式的安装包安装(本文使用的是这种安装方法,下载地址http ...
- mysql 查询导出 excel 中文乱码 解决 --default-character-set=gbk
mysql --default-character-set=gbk -uroot -p -D open_fusion -e " select * from table1 " ...
- jwt的思考
什么是jwt jwt的问题 jwt的是实践 https://www.pingidentity.com/en/company/blog/posts/2019/jwt-security-nobody-ta ...
- PTA A1017
A1017 Queueing at Bank (25 分) 题目内容 Suppose a bank has K windows open for service. There is a yellow ...
- 《JAVA高并发编程详解》-类的加载过程简介
- timeout超时时长优化和hystrix dashboard可视化分布式系统
在生产环境中部署一个短路器,一开始需要将一些关键配置设置的大一些,比如timeout超时时长,线程池大小,或信号量容量 然后逐渐优化这些配置,直到在一个生产系统中运作良好 (1)一开始先不要设置tim ...