题目地址

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];// Jfor(int i = 0; i <= n; ++i) ans = max(ans, A + sf[i + 1]);// Ofor(int i = 0; i <= n; ++i) {ans = max(ans, A + sl[i][0] * sr[i + 1][2]);}// Ill 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);
}

转载于:https://www.cnblogs.com/henry-1202/p/11432874.html

LOJ#2343. 「JOI 2016 Final」集邮比赛 2相关推荐

  1. 【题解】LOJ3254:「JOI 2020 Final」集邮比赛 3

    原题传送门 发现 n < = 200 n<=200 n<=200,那么我们就可以想一个 O ( n 3 ) O(n^3) O(n3)的dp 发现每次肯定是向左/右推进 可以令 d p ...

  2. 「JOI 2016 Final」断层

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

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

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

  4. T3:LOJ2332「JOI 2017 Final」焚风现象.cpp

    记录差值 然后每次运算一下头和尾 如果尾端是最后一次增加则不用运算尾端 详见代码 #include<iostream> #include<cstdio> #include< ...

  5. Libre OJ P2332「JOI 2017 Final」焚风现象【差分思想】By cellur925

    题目传送门 这道题开始看起来会很晕...\(qwq\).首先我们要明确题目中的海拔&&温度.温度是受海拔影响的,每次改变的是海拔,我们求的是温度. 我们开始读入的时候便可以处理出开始\ ...

  6. 【2018.10.1】「JOI 2014 Final」年轮蛋糕

    题面 一看到求"最小值的最大值"这种问题,就能想到二分了. 二分答案,然后我们要把一圈分成三块,使这三块的大小都$\geq mid$.做法是把环展开成2倍长度的链,先钦定一个起点, ...

  7. 【题解】LOJ2350:「JOI 2018 Final」月票购买

    原题传送门 可以很套路地得到一个结论,答案与月票的路径有一段连续的重复路径 以 s , t , u , v s,t,u,v s,t,u,v为起点跑四次最短路 现在我们枚举两个月票最短路上的点 x , ...

  8. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  9. [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)

    [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 -- 接着他们发现自己收 ...

  10. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

最新文章

  1. 【数字信号处理】数字信号处理简介 ( 抽样定理 | 多抽样率 )
  2. Java - I/O
  3. vscode 配置 pcl头文件库
  4. 千元内无敌!红米两款新机发布 小米9侧目?
  5. Java,使用泛型构建自己的工具包——包装System.out
  6. 如何通过FTP从Mac快速发送和接收文件
  7. Android studio3.5调用Numcpp库方法
  8. 计算机软件职称考试多媒体,多媒体应用设计师教程(第2版全国计算机技术与软件专业技术资格水平考试指定用书)...
  9. 视频教程-Word从入门到精美排版教程:手把手学习Word2019精美排版-Office/WPS
  10. mongodb3 重启_“打工人”必备技能 OPPOR9splus重启让手机再战一年|手机|打工人|oppor|splus...
  11. 奇迹mu开服教程:服务端的架设及开服注意事项
  12. linux skype 4.3,在Arch Linux上安装Skype 4.3(最新版本)
  13. Java中 字节转 KB/MB/GB
  14. dataframe更改columns
  15. 微信支付小程序支付和APP支付
  16. 如何用Python制作一个简单的二维码生成器
  17. Techwiz OLED:透明显示
  18. Linux修改密码提示鉴定令牌操作错误
  19. python3新式类_Python之新式类与经典类
  20. 《Event Structure Representation: Between Verbs and Argument Structure Constructions》翻译(一)

热门文章

  1. 深度探索C++对象模型第一章第一节重点
  2. ddr3配置 dsp6678_简简单单学TI 多核DSP(2):TMS320C6678的时钟配置
  3. python使用协程_Python使用协程进行爬虫
  4. 拓端tecdat|R语言中基于混合数据抽样(MIDAS)回归的HAR-RV模型预测GDP增长
  5. java integer源码_Integer包装类源码分析
  6. 用oracle的sqlload导入文件到数据库
  7. 【Leetcode】亮眼题/新思路
  8. vb连接mysql未发现_vb连接mysql(错误代码)
  9. Caffe学习:Forward and Backward
  10. 如何开发神经网络来预测汽车保险支出