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 ...
随机推荐
- Graph machine learning 工具
OGB: Open Graph Benchmark https://ogb.stanford.edu/ https://github.com/snap-stanford/ogb OGB is a co ...
- 个人GitHub资源分享仓库
个人GitHub资源分享仓库 门牌号:https://github.com/ZeroPhong/Learning-Resource 2019年10月27日 注册GitHub账号,仓库建立: 当天上 ...
- 实现动态WEB内容
在 system1 上配置提供动态web内容,要求: 1.动态内容由名为 wsgi.group8.example.com 的虚拟主机提供 2.虚拟主机侦听在端口 8909 3.从 http://ser ...
- SpringBootServletInitializer报错
1. 现象 从Springboot 1.5.1.RELEASE 升级到Springboot 2.1.2.RELEASE 后SpringBootServletInitializer报错. 2.解决方法 ...
- 最全的 pip 使用指南,50% 你可能没用过
所有的 Python 开发者都清楚,Python 之所以如此受欢迎,能够在众多高级语言中,脱颖而出,除了语法简单,上手容易之外,更多还要归功于 Python 生态的完备,有数以万计的 Python 爱 ...
- win10下jupyter修改默认路径的办法
查了很多资料,发现都不管用,最后亲测找到一种方法. 实现的方法就是修改快捷方式标签的目标栏,如下图: 后面有一个%USERPROFILE% 将%USERPROFILE%改成你要的路径就可以了 然后应用 ...
- Python基础知识(八)----文件操作
文件操作 一丶文件操作初识 ###f=open('文件名','模式',编码): #open() # 调用操作系统打开文件 #mode #对文件的操作方式 #encoding # 文件的编码格式 存储编 ...
- angular http interceptors 拦截器使用分享
拦截器 在开始创建拦截器之前,一定要了解 $q和延期承诺api 出于全局错误处理,身份验证或请求的任何同步或异步预处理或响应的后处理目的,希望能够在将请求移交给服务器之前拦截请求,并在将请求移交给服务 ...
- 笔记本端查看以前的wifi密码
家里老人忘记密码了.好像是我改了从,我也忘了,手中安卓手机root后也没找到记录密码的文件,水果机懒得弄了,突然想起来电脑还有记录,应该可以找到. 此篇也顺带记录下怎么通过手中笔记本找到以前练过的wi ...
- windows xp远程连接
本节将用到windows网络共享,实现外网可以远程连接局域网内的任意主机 实验环境 两台windows xp虚拟机(内网+外网),一台主机 配置外网虚拟机 首先,为虚拟机添加两块网卡.一块作为网关(内 ...