【题解】P13345 [EGOI 2025] IMO

news/2025/9/27 17:50:15/文章来源:https://www.cnblogs.com/QWQcoding/p/19115387

先把最终的排名给弄出来,然后就在从高到低排好序的 \(a\) 数组上来看。

我们显然只需要考虑相邻排名的选手之间的限制。

\(f_{i,j}\) 表示考虑了前 \(i\) 名选手,且第 \(i\) 名选手的得分最小值为 \(j\) ,最小的答案。

为了实现转移,我们需要知道每个选手能够弄出什么样的得分。每个选手最终的分布都可以用 “确定的得分和、隐藏得分的题目个数” 这样的二元组来表示。

对于第 \(i\) 名选手,使用 \(g_{j,t,p}\) 表示考虑了前 \(j\) 道题,当前确定的得分和为 \(t\) ,隐藏得分的题目个数为 \(p\) ,这种情况是否可行。转移很容易,只需决策当前这道题是否隐藏即可。

回到 \(f\) 的转移,枚举 \(i\) 、第 \(i\) 位选手的得分下界 \(j\) ,以及该选手隐藏的题目个数 \(num\)

得分下界 \(j\) 其实就是“当前确定的得分和”,此时第 \(i\) 位选手的得分上界即为 \(j+num\times k\),只需第 \(i-1\) 位选手的得分下界比第 \(i\) 位选手的得分上界更大即可。注意这里“更大”需要比较是否 \(i\)\(i-1\) 原始编号的大小,这会影响两人得分能否相同。

来看看复杂度,使用 bitset 可以将 \(p\) 这一维压掉。\(f\) 的状态数是 \(n\times mk\) ,转移 \(m\) ;对于每个 \(i\)\(g\) 的状态数 \(m\times mk\times m\)\(O(1)\) 转移,bitset 优化可以去掉一个 \(\omega\) 。这么来看复杂度大概是 \(O(n\log n+nm^2k+nm^3k/\omega)\) ,可以获得 \(72\text{pts}\)

但是状态真的有这么大吗??记 \(sum_i\) 为第 \(i\) 人的原始得分总和。对于 \(f_{i,j}\)\(j\) 这一位的取值只能取 \([sum_{i+1},sum_{i}]\) 中,否则 \(j\) 太小第 \(i+1\) 人就没法填了。故 \(f\) 的状态数为 \(\sum_{i=1}^n (sum_i-sum_{i+1})\) 。而且转移也不需要 \(O(m)\) ,只需计算 \(p\in[0,(sum_{i-1}-sum_{i+1})/k]\) 的值。计算 \(f\) 的复杂度变为 :

\( \sum_{i=1}^n (sum_i-sum_{i+1})(sum_{i-1}-sum_{i+1})/k\leq \sum_{i=1}^n(sum_{i-1}-sum_{i+1})^2/k=O(m^2k) \)

然后再看 \(g\) ,对于给定的 \(i,j\) ,并不是所有的 \(t\) 都有用。记 \(d=sum_{i}-sum_{i+1}\) ,最终 \(j=m\)\(t\) 的取值为 \([sum_{i+1},sum_i]=[sum_i-d,sum_i]\),因此对于每个 \(j\) 作转移时,只用计算最大 \(d\) 个有用的 \(t\) 。计算 \(g\) 的复杂度为 \(O(\sum_{i=1}^n (sum_i-sum_i+1)\times m\times m/\omega)=O(m^3k/\omega)\)

总复杂度 \(O(n\log n+m^2k+m^3k/\omega)\)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read(){ll x=0; bool f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=0; ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48); ch=getchar();}return f?x:-x;
}
inline void write(ll x){if(x<0) x=-x,putchar('-');if(x>9) write(x/10);putchar('0'+x%10);
}
const ll N=20009;
const ll M=103;
const ll K=103;
bitset<109> g[2][M*K];
ll n,m,k;
ll a[N][M];
ll sum[N];
ll cnt=0;
ll id[N],rk[N];
inline void init(ll i,ll d){for(ll t=0;t<=m*k+2;t++){g[0][t].reset();g[1][t].reset();}g[0][0][0]=1;ll cur=0;for(ll j=1;j<=m;j++){cur+=a[i][j];for(ll t=max(0,cur-d);t<=cur;t++) g[j&1][t].reset();for(ll t=max(0,cur-d);t<=cur;t++){if(t>=a[i][j]) g[j&1][t]=g[j&1^1][t-a[i][j]];g[j&1][t]|=(g[j&1^1][t]<<1);}}
}ll f[2][M*K];
bool cmp(ll x,ll y){if(sum[x]!=sum[y]) return sum[x]>sum[y];return x<y; 
}
int main(){n=read(),m=read(),k=read();for(ll i=1;i<=n;i++){id[i]=i;for(ll j=1;j<=m;j++){a[i][j]=read();sum[i]+=a[i][j];}}sort(id+1,id+n+1,cmp);for(ll i=1;i<=n;i++){rk[id[i]]=i;}id[0]=n+1;rk[n+1]=0;sum[n+1]=m*k;for(ll i=1;i<=n;i++){ll p=id[i];memset(f[i&1],0x3f,sizeof(f[i&1]));init(p,sum[id[i]]-sum[id[i+1]]);for(ll j=sum[id[i+1]];j<=sum[id[i]];j++){for(ll num=0;num<=(sum[id[i-1]]-sum[id[i+1]])/k;num++){ll mid=j+num*k;if(g[m&1][j][num]){if(id[i-1]<id[i]){f[i&1][j]=min(f[i&1][j],f[i&1^1][mid]+m-num);}else{f[i&1][j]=min(f[i&1][j],f[i&1^1][mid+1]+m-num);}}}}for(ll j=sum[id[i]];j>=sum[id[i+2]];j--){f[i&1][j]=min(f[i&1][j],f[i&1][j+1]);}}printf("%d\n",f[n&1][0]);return 0;
}

最大测试点用时不超过 400ms ,时限6000ms。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vivado兼容第三方软件工具对照表Modelsim,Questasim,Matlab

Vivado兼容第三方软件工具对照表Modelsim,Questasim,Matlab Vivado兼容第三方软件工具对照表Modelsim,Questasim,Matlabhttps://blog.csdn.net/Alonger1988/article/details/120506385

2025电线电缆厂家最新权威推荐榜:聚焦电线电缆实力企业,覆盖多场景需求助力精准选购

在工业生产、民生建设、新能源及通信等领域,电线电缆作为核心传输载体,其质量与性能直接决定工程安全与运行效率。当前市场中,电线电缆企业数量繁杂,部分企业存在原材料劣质、工艺不规范等问题,导致产品性能不达标…

详细介绍:Python高效合并Excel多Sheet工作表,告别繁琐手动操作

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Python爬虫的实现流程

Python爬虫的实现流程一、数据来源分析 1、明确需求: 明确采集的网站以及数据内容 * 网址:https://www.bilibili.com/video/BV1o675zAESg/?spm_id_from=333.1387.upload.video_card.click&vd_source=7893f8f278…

常州溧阳网站建设wordpress全屏广告插件

UPD&#xff1a;2018/10/9 第一次墙外调查&#xff1a;立个Flag吧&#xff01;第100场&#xff0c;上红&#xff01; 哈哈哈哈哈哈哈哈哈哈&#xff01; 妙啊&#xff01; UPD&#xff1a;2018/10/23 第二次墙外调查&#xff1a;下一场&#xff0c;要不要试着把橙名第二段击穿呢…

长沙网开亿面做网站多少钱网络工程师的前景

既然你是一名 Linux 用户&#xff0c;为什么不关注一下开源绘图应用程序呢&#xff1f;-- Ankush Das(作者)小时候&#xff0c;当我开始使用计算机(在 Windows XP 中)时&#xff0c;我最喜欢的应用程序是微软的“画图”。我能在它上面涂鸦数个小时。出乎意料&#xff0c;孩子们…

调度算法,上古三算法

先来先服务FCFS 周转时间=完成时间-到达时间 带权周转时间=周转时间/运行时间 等待时机=周转时间-运行时间-io操作时间 是非抢占式的算法 优点:公平,算法实现简单 缺点:排在长作业后面的短作业需要等待很长时间,带…

2025 年电脑租赁公司最新推荐排行榜:深度解析 TOP3 优质租电脑公司,助企业个人租赁电脑选择指南

在数字化时代,电脑是企业办公、个人学习娱乐的核心工具,可传统购买模式弊端显著。企业购置电脑资金占用大、闲置率高且运维成本高,个人买高性能电脑投入大、易过时。租电脑因成本可控、灵活等优势成趋势,但市场公司…

完整教程:✨WPF编程基础【1.2】:XAML中的属性

完整教程:✨WPF编程基础【1.2】:XAML中的属性pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

全屏响应式网站模板有关网站开发的文献

let和const关键字&#xff1a;let和const允许你声明具有块级作用域的变量和常量。这有助于避免使用var时可能出现的变量提升和全局污染问题。模板字符串&#xff1a;使用反引号()可以创建多行字符串和嵌入表达式。 javascript let name world; let greeting Hello, ${name}!…

自动化运维工具 Ansible 集中化管理服务器 - 实践

自动化运维工具 Ansible 集中化管理服务器 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

学位论文中 公式的插入,格式调整、编号以及引用

mathtype导致论文行间距变大,解决方案看这儿:https://www.cnblogs.com/dwj192/p/18457816

2025 北京羊蝎子餐厅推荐排行榜:TOP3最新必吃榜单,聚焦朝阳昌平东城等区域,揭秘北京羊蝎子餐厅必吃的门店!

2025 年的北京餐饮市场,羊蝎子凭借醇厚骨香与滋补属性仍是食客高频选择,朝阳、昌平、东城、二拨子等热门区域门店密集,却也暗藏食材参差、工艺敷衍的问题 —— 肉质柴硬、汤底寡淡、营业时长不足等痛点,让不少人难…

复刻江协激光触发器

复刻江协激光触发器 1、初始化硬件将PB8和PB9分别设为SCK与SDA端的接口注意:江协的OLED驱动为软件模拟IIC所以不要使能IIC模块使能RCC,改为外部晶振将PA9设为GPIO_EXTI,接入激光模块的D0端并使能GPIO的外部中断在ma…

Eurocrypt 2021 s Accepted Papers

转载自:https://eurocrypt.iacr.org/2021/acceptedpapers.phpAccepted Papers 接收论文These papers are listed in order of submission.这些论文按提交顺序排列。Secure Software Leasing 安全软件租赁 Prabha…

Linux云服务器如何手动配置DNS?

在Linux云服务器上手动配置 DNS(域名系统) 是确保服务器能够正常解析域名的重要步骤。以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案。1. 为什么需要手动配置 DNS? 默认情况下,云服务器会自动使用…

Python 输入、输出的用法

input的用法 很简单,直接在编制器里面输入input() 就可以读取一串字符串,注意:input会输入一整行字符串 比如说下面这个例子 a = input() intput 也可以是在括号内放入一个字符串 这样输入的时候,就会看到这个屏幕…

第一章——概论 - AlgosEng

计算机基本概念 逻辑模块:输入设备、控制器、运算器、存储器、输出设备 存储程序工作方式:编制程序、存储程序、自动连续执行程序、输出结果 计算机分类:模拟计算机(由模拟运算器构成,处理连续模拟量)、数字计算…

用django做的网站西乡做网站

我们在javaEE的开发中&#xff0c;肯定是要用到数据库的&#xff0c;那么在javaEE的开发中&#xff0c;是如何使用代码实现和SQL2008的连接的呢&#xff1f;在这一篇文章中&#xff0c;我将讲解如何最简单的使用jdbc进行SQL2008的数据库的连接的。首先我们看下我们的数据库的一…