当前位置: 首页 > news >正文

题解:P12550 [UOI 2025] Reversal ABC

提供一种不一样的思路,也是 \(O(n)\) 的。

首先注意到几个结论:

  • 注意到一个元素只会往一个方向移动。

  • 注意到如果同一个元素最多只会用一种方式移动,比如对于一个 A,如果用 AB -> BA 交换过了,就不可能再通过 CA -> AC 再交换,以后都只能用 AB -> BA 了。

  • 注意到可以先把在一起的相同元素缩在一起,交换时在一起的相同元素只会往一边交换。

  • 注意到以上结论我想了 1 个小时。

接下来考虑建图,在移动起点和移动终点间连一条线段,权值为操作次数。

比如 CABC,可以建出如下图:

此时答案为选择两两不重叠的线段时的最大权值和(点重叠也算重叠,例子中答案就是选 CA 线段和 BC 线段)。这个直接随便 DP 即可。设 \(f_i\) 表示从 \(1\sim i\) 的最大权值,直接 \(f_i\gets\max(f_{i-1},\max_{(j,i,w)\text{ is a segment}}\{f_{j-1}+w\})\),注意一下我在的代码中是反着 DP 的。

但实际上它不一定是相邻的交换,还有一大堆漏洞。例如 CABABABC,此时第一个 A 可以连向这段区间后面所有的 B,是 \(O(n^2)\) 的。同时,中间的 A 本来也可以和 B 交换,但因为不能选重叠线段就没了。

对于上述问题,可以视为都是 ABABABAB 型导致的(BCBCBCCACACA 同理下面就不说了),逐一修复:

  • “因为不能选重叠线段就没了”,考虑把中间的贡献也带着计算上。例如第一个 A 和第二个 B 连边时权值就变成 \(3\) 而非 \(2\)
  • “关于时间复杂度和边数 \(O(n^2)\)”,考虑再注意到一个结论。
    • 此时只有第一个 A 和最后一个 B 有可能被两边的字符带着交换导致不参与这个大段(例如 CACACACACAC[A BABA B]CBCBCBCBCBCBC),但中间的绝对会交换。

    • 所以只建第一个 A 到最后一个 B、第二个 A 到最后一个 B、第一个 A 到倒数第二个 B、第二个 A 到倒数第二个 B 的边即可。对应边的贡献贡献直接减减少量即可。效果如下图所示:

    • 此时可以直接扫过去计算,所以时间复杂度也跟着变成 \(O(n)\) 的了。

代码:(有亿点丑,不建议看)

#include<bits/stdc++.h>
using namespace std;
namespace estidi{const int mn=1000003;struct num{int tp;long long cnt;};char cc[mn];long long f[mn];vector<num>v,nv[mn];int main(){int tc,n,pre;long long cnt;string s;scanf("%d",&tc);while(tc--){scanf("%d %s",&n,cc);s=cc;pre=s[0]-'A'+1;cnt=0;v.push_back({0,0});for(int i=0;i<n;i++){if(s[i]-'A'+1!=pre){v.push_back({pre,cnt});pre=s[i]-'A'+1;cnt=0;}cnt++;}v.push_back({pre,cnt});v.push_back({0,0});for(int i=1;i<v.size()-1;i++)if(v[i+1].tp==(v[i].tp%3+1)){int pos=i;long long now=0,anow=0,ans=0;while(v[pos].tp==v[i].tp&&v[pos+1].tp==v[i+1].tp){now+=v[pos].cnt;anow+=v[pos+1].cnt;ans+=now*v[pos+1].cnt;pos+=2;}pos-=2;if(i==pos)nv[i].push_back({i+1,ans});elseif(i==pos+2){nv[i].push_back({pos+1,ans});nv[i].push_back({pos-1,ans-now*v[pos+1].cnt});nv[i+2].push_back({pos+1,ans-anow*v[i].cnt});}else{nv[i].push_back({pos+1,ans});nv[i].push_back({pos-1,ans-now*v[pos+1].cnt});nv[i+2].push_back({pos+1,ans-anow*v[i].cnt});nv[i+2].push_back({pos-1,ans-anow*v[i].cnt-now*v[pos+1].cnt+v[i].cnt*v[pos+1].cnt});}i=pos;}for(int i=1;i<v.size();i++){f[i]=max(f[i],f[i-1]);for(int j=0;j<nv[i].size();j++){f[nv[i][j].tp+1]=max(f[nv[i][j].tp+1],f[i]+nv[i][j].cnt);}}printf("%lld\n",f[v.size()-1]);for(int i=1;i<v.size();i++){vector<num>().swap(nv[i]);f[i]=0;}vector<num>().swap(v);}return 0;}
}
int main(){// freopen("string.in","r",stdin);// freopen("string.out","w",stdout);estidi::main();return 0;
}
http://www.rkmt.cn/news/22975.html

相关文章:

  • 编译安装gdb 编译安装gdb
  • 2025年10月商标注册公司推荐榜:五强对比与中立评测助您高效决策
  • 2025年发电机组厂家推荐排行榜,柴油/燃气/船用/静音箱式/移动拖车式/集装箱式/上柴/玉柴/潍柴/康明斯/沃尔沃/道依茨/帕金斯/MTU发电机组公司推荐!
  • 2025年10月敏感皮肤修复产品推荐榜:五款热门单品深度对比与客观评析
  • 题解:P7275 计树
  • mysql新建用户并授权,mysql新建用户并授权完整指南
  • CRC32的直接和反转模式
  • 2025年10月石墨电极厂家推荐榜单详解:从产线到应用看晶碳科技真实表现
  • 2025年西安买房新楼盘口碑排行榜:地建嘉信臻城领跑高端住宅市场
  • 2025年数粒机厂家推荐排行榜,防爆/新型/高速/高精度/智能/大容量/多通道/电子/视觉/全自动/低噪音/制药用/农业用/食品用/电子元件/光电/定制化/鹌鹑蛋/糖果/坚果/药品/片剂数粒机公司推荐
  • git和gitee的学习研究
  • 从“看得见”到“看得懂”:国标GB28181算法算力平台EasyGBS与公安安防数字化的深度融合
  • 山海鲸可视化可以导入哪些常用的3D模型?
  • 读书笔记:什么时候该用B*树索引?一个接地气的解读
  • 2025年工作服厂家权威推荐榜:防静电/劳保/国网/餐厅/工厂/电工/防酸碱/电力/车间/航空/员工工作服,文化衫/T恤/POLO衫/冲锋衣全品类精选
  • 误删 Stash 后的数据恢复实践
  • 2025年10月重庆保洁公司推荐排名:聚焦服务细节与合规风险的避坑手册
  • 2025年10月床垫品牌推荐榜:围绕环保认证与试睡政策的系统化评析
  • 2025年10月上海装修公司推荐榜:极家家居设计标准与施工节点全维度对比
  • 2025年浓缩机厂家权威推荐榜:高效浓缩机/尾矿浓缩机/污泥浓缩机/新型浓缩机/矿用浓缩机/浓密机/中心转动浓缩机/真空浓缩机/污泥脱水机
  • Clip Studio Paint 4.0.3下载地址与安装教程
  • 低代码平台核心概念与设计理念
  • PyTorch nn.Linear 终极详解:从零理解线性层的一切(含可视化+完整代码) - 指南
  • 2025年陶瓷过滤机厂家权威推荐榜:盘式/矿用/全自动陶瓷真空过滤机,真空脱水机,尾矿干排设备,圆盘过滤机源头企业深度解析
  • 使用python脚本大批量自动化处理图片上的ai水印
  • springboot结合阿里巴巴easyexcel,实现一键导出数据到Excel中
  • 深入解析:PX4 无人机地面调试全攻略:从机械到参数的系统优化
  • 2025年陶瓷过滤板厂家推荐排行榜,白刚玉陶瓷过滤板,棕刚玉陶瓷过滤板,扇形陶瓷板,真空陶瓷过滤板,陶瓷滤膜,陶瓷过滤机配件公司推荐
  • springboot结合阿里巴巴easyexcel,实现一键把Excel数据导入数据库
  • 2025年工业设备安装厂家权威推荐榜:管道/电气/暖通空调/空压系统/纯水系统/厂房通风/车间配电/机械设备专业安装服务全景解析