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

[ICPC 2024 Yokohama R] Peculiar Protocol

我们约定:

  • \(f_{l,r}\) 表示 \([l,r]\) 最多可以进行的操作次数(不一定要全部消掉)。
  • \(s_{l,r}\) 表示 \([l,r]\)\(a\) 的和。

考虑 \(f\) 应该怎么求解,根据区间 DP 的套路我们枚举中间点:

\[f_{i,j}=\max\limits_{k=i}^{j-1} f_{i,k}+f_{k+1,j} \]

显然,我们还需要处理这一次合并之后新增的操作次数。

如果 \(s_{i,j}\equiv r\times (f_{i,j}+1) \pmod d\),那么我们就可以多操作一次,即:

\[f_{i,j}\gets f_{i,j}+[s_{i,j}\equiv r\times (f_{i,j}+1) \pmod d] \]

引理:

一个区间可以被操作 \(c_0\) 次操作完,当且仅当 \(c_0\) 满足:

\[c_0\times r\equiv s_{i,j} \pmod{d}\wedge c_0\le f_{i,j} \]

因为 \(c_0\le f_{i,j}\)\(c_0\) 次操作肯定是可以进行的,我们只需要证明进行 \(c_0\) 次操作可以把 \([i,j]\) 全部消掉。
那么我们不妨先随便进行 \(c_0-1\) 次操作,那么消除的和一定是 \(r\times (c_0-1)+kd\),其中 \(k\) 是一个非负整数。

所以我们剩下的显然会是 \(r+k'd\)(因为第一个条件),所以就可以一次全部消掉。

假设最终的序列进行了 \(k\) 次操作,那么最后我们获得的收益就是:

\[\frac{s_{1,n}-kr}{d} \]

显而易见,我们应该让 \(k\) 尽可能小,于是就有了一个天才般的想法。

我们给每一个区间求出满足条件的最小的 \(c_0\)(没有满足条件的取 \(+\infty\)),然后再进行一次区间 DP 即可。

对于 \(c_0\) 具体的求解,因为 \(c_0\) 一定是 \([1,n]\) 中的整数,我们直接枚举所有的可能然后预处理出来就行了。

时间复杂度为 \(O(n^2)\),模拟赛的时候饭堂了,没有想到。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=505;
int n,d,r,a[N],f[N][N],g[N][N];
unordered_map<int,int> c0;
int s(int l,int r){return a[r]-a[l-1];}
signed main(){ios::sync_with_stdio(false);cin.tie(nullptr);cin>>n>>d>>r;for(int i=1,s=0;i<=n;i++){cin>>a[i];if(a[i]%d==r) f[i][i]=1,g[i][i]=a[i]/d;s=(s+r)%d,a[i]+=a[i-1];if(!c0[s]) c0[s]=i;}for(int len=2;len<=n;len++){for(int i=1;i+len-1<=n;i++){int j=i+len-1,c0=::c0[s(i,j)%d];for(int k=i;k<j;k++){g[i][j]=max(g[i][j],g[i][k]+g[k+1][j]);f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]);}f[i][j]+=!((s(i,j)-(f[i][j]+1)*r)%d);if(c0&&c0<=f[i][j]){g[i][j]=max(g[i][j],(s(i,j)-c0*r)/d);}}}cout<<g[1][n]<<'\n';return 0;
}
http://www.hskmm.com/?act=detail&tid=10505

相关文章:

  • YOLO入门理解 基础概念
  • The 2025 ICPC Asia East Continent Online Contest (II)(C,D,E,H,I)
  • 2022年十大Web黑客技术提名开启
  • 13. LangChain4j + 加入检索增加生成 RAG(知识库) - Rainbow
  • 终旅之始——2025 . 9 . 20
  • 深入理解Django Admin只读字段与保存模型的自定义操作 - 详解
  • 深度学习(视觉注意力SeNet/CbmaNet/SkNet/EcaNet)
  • 起床
  • qoj6277 Linear Congruential Generator
  • docker+k8s
  • 多模型适配突围:JBoltAI如何重构企业数智化转型新范式?
  • JBoltAI赋能制造业数智化转型:AI从概念到落地的Java实践
  • JBoltAI赋能医疗数智化转型:AI大模型如何重塑医疗健康新范式
  • JBoltAI多模态赋能:制造业数智化升级的新引擎
  • 深入解析:YARN架构解析:深入理解Hadoop资源管理核心
  • JBoltAI:破解Java企业级AI应用落地难题的利器
  • 直播软件开发,单例设计模式很简单吗? - 云豹科技
  • Java开发者的AI革命:如何用JBoltAI应对数智化转型挑战
  • JBoltAI:赋能Java老项目快速接入AI能力的创新之道
  • Day04 C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\David\operator Demo01-08+Doc
  • 实用指南:养老专业实训室建设方案的分级设计与人才培养适配
  • 物业企业绩效考核制度与考核体系 - 指南
  • Java开发生态的数智化升级:JBoltAI如何重塑企业AI应用架构
  • Mapper.xml与数据库进行映射的sql语言注意事项
  • 直播软件搭建,如何实现伪分布式平台部署? - 云豹科技
  • 初步研究vivio的互传的备份数据格式
  • 完整教程:C#.NetCore NPOI 导出excel 单元格内容换行
  • resultMap和resultType
  • 直播软件怎么开发,自适应两栏布局方式 - 云豹科技
  • resultMap和自定义映射结果形式(ResultMapManage)以及ResultMap Vs ResultType