题目地址

https://loj.ac/problem/2343

题解

首先处理出\(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的更多相关文章

  1. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  2. LOJ#2764. 「JOI 2013 Final」JOIOI 塔

    题目地址 https://loj.ac/problem/2764 题解 真的想不到二分...不看tag的话... 考虑二分答案转化为判定问题,那么问题就变成了能不能组合出x个JOI/IOI,考虑贪心判 ...

  3. loj 3014「JOI 2019 Final」独特的城市

    loj 我本来是直接口胡了一个意思一样的做法的,但是因为觉得有点假+实现要用并查集(?)就卡了好一会儿... 对于一个点\(x\)来说,独特的点一定在它的最长链上,如果有独特的点不在最长链上,那么最长 ...

  4. loj 2759「JOI 2014 Final」飞天鼠

    loj 这题有在一棵树上上升或者下降的操作,稍加分析后可以发现上升操作如果不是一定要做(指高度不足以到下一棵树或者是最后到达\(n\))就不做,下降操作也是如果不是一定要做(指到达下一棵树时高度过高) ...

  5. loj 2336「JOI 2017 Final」绳

    loj 首先,所有位置最多被染色一次,因为要染多次的话,还不如一开始就染成最终的颜色.并且你可以一开始就染好色 因为最终长度为2,那么如果染完后这个序列可以被折完,那么首先最多只有两种颜色,还有就是要 ...

  6. 「JOI 2016 Final」断层

    嘟嘟嘟 今天我们模拟考这题,出的是T3.实在是没想出来,就搞了个20分暴力(还WA了几发). 这题关键在于逆向思维,就是考虑最后的\(n\)的个点刚开始在哪儿,这样就减少了很多需要维护的东西. 这就让 ...

  7. Luogu P5103 「JOI 2016 Final」断层 树状数组or线段树+脑子

    太神仙了这题... 原来的地面上升,可以倒着操作(时光倒流),转化为地面沉降,最后的答案就是每个点的深度. 下面的1,2操作均定义为向下沉降(与原题意的变换相反): 首先这个题目只会操作前缀和后缀,并 ...

  8. loj#2334 「JOI 2017 Final」JOIOI 王国

    分析 二分答案 判断左上角是否满足 为了覆盖所有范围 我们依次把右下角,左上角,右上角移动到左上角 代码 #include<bits/stdc++.h> using namespace s ...

  9. loj#2333 「JOI 2017 Final」准高速电车

    分析 我们发现到达一个点一定是先快车再准快车再慢车 于是快车将1-n分为多个区间 每次取出每个区间当前能到达的点的数量 选剩余时间贡献最大的的一个取得贡献并且再能到达的最远点建立准快车 代码 #inc ...

随机推荐

  1. MySQL报错Packet for query is too large问题解决

    今天用java写了批量插入运行时,报错: Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigExcep ...

  2. spark sc.textFile() 指定换行符

    直接上代码 package com.jason.spark23 import org.apache.spark.sql.SparkSession import org.apache.spark.Spa ...

  3. jquery监听回车

    jquery监听回车 <pre> $("#loginusername, #loginpassword, #code").keydown(function() { if( ...

  4. python的帮助信息的写法

    # coding = utf-8from optparse import OptionParserfrom optparse import OptionGroup usage = 'Usage: %p ...

  5. [转帖]征服诱人的Vagrant!

    征服诱人的Vagrant! https://www.cnblogs.com/hafiz/ 一.背景 ​ 最近要开始深入学习分布式相关的东西了,那第一步就是在自己的电脑上安装虚拟机,以前在Windows ...

  6. Word 插入页码 -- 视频教程(7)

    1. 以本科做的一个课程设计为例 >> 视频教程链接:B站,速度快,清晰 未完 ...... 点击访问原文(进入后根据右侧标签,快速定位到本文)

  7. John Lemon's Haunted Jaunt(鬼屋游戏笔记)

    1.使用Unity  2019.2.3 2.角色移动的控制脚本 3.后期处理组件PostProcessLayer  (类似给相机加上了一层滤镜) 4.制作简单的怪物AI系统,使用 NAvMeshAge ...

  8. 个人Wiki搭建(Gitbook + GitHub Pages)

    工具选择:Gitbook + GitHub Pages 大概流程: 首先在本地编写md文件,然后生成对应的html文件,最后将这些html文件推送到github对应的gitbook仓库. 具体步骤: ...

  9. mongoDB 分组并对分组结果筛选类似于SQL中的(group by xxx having ) 附带Java代码

    今天需要做一个筛选程序,因为数据放在mongodb中,没写过分组的查询语句,查了一些资料,终于写出来了,分享给各位小伙伴 需求是 查询 学员 在2019-07-29之后未同步的数据(同一个学员需要2条 ...

  10. 你也可以写个聊天程序 - C# Socket学习1

    原文:你也可以写个聊天程序 - C# Socket学习1 简述 我们做软件工作的虽然每天都离不开网络,可网络协议细节却不是每个人都会接触和深入了解.我今天就来和大家一起学习下Socket,并写一个简单 ...