news 2026/6/26 2:20:35

P10786 [NOI2024] 百万富翁 题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
P10786 [NOI2024] 百万富翁 题解

Subtask 2

不难想到每次请求把候选点集合二等分并对应连边,每条边必然排除一个数。于是每次请求排除一半候选点。可以做到 t=20,s=106t=20,s=106,期望得分 1111。

题目要求 t≤8,s≤1099944t≤8,s≤1099944。我们需要用查询次数换请求次数。10999441099944 这样的奇怪限制启发我们 dp。设 fk,ifk,i​ 为用 kk 次请求,把 ii 个候选点缩减到 11 个的最少查询次数,答案即为 f8,Nf8,N​。转移为:

fk,i=min⁡1≤j<i(fk−1,j+w(j,i))fk,i​=1≤j<imin​(fk−1,j​+w(j,i))

其中 w(j,i)w(j,i) 为一次请求把 ii 个候选点缩减到 jj 个的最小查询次数。现在问题变成如何计算 ww。

对于每次请求,我们不妨把查询视作无向图 GG 的边。那么交互库会把图定向成 DAG(大指向小),有入度的点一定会被排除,只保留入度为 00 的点。

因此在一次请求中留下来的点集中两两无边,是 GG 的独立集。反过来,任意独立集(或其超集)都能取到:将独立集安排在拓扑序最前面,然后按照拓扑序给边定向就能给出构造。

因此,如果我们希望一次请求后最多剩下 jj 个候选点,必须保证

α(G)≤jα(G)≤j

其中 α(G)α(G) 是 GG 的最大独立集大小。因此 w(j,i)w(j,i) 就转化为有 ii 个点且满足 α(G)≤jα(G)≤j 的图 GG 的最小边数

手模小样例,发现一个比较优秀的构造:把 ii 个点平均分成 jj 组,每组连成完全图,总边数为

w(j,i)=(imodj)⋅(⌊i/j⌋+12)+(j−(imodj))⋅(⌊i/j⌋2)w(j,i)=(imodj)⋅(2⌊i/j⌋+1​)+(j−(imodj))⋅(2⌊i/j⌋​)

事实上,可以证明这是最优构造:

注意到,GG 的独立集和补图 G‾G 中的团一一对应。因此

α(G)≤j⟺Kj+1∉G‾α(G)≤j⟺Kj+1​∈/G

而 GG 的边数最少等价于 G‾G 的边数最多。

这正是图兰定理:

在所有 ii 个点且不包含 Kj+1Kj+1​ 的图中,边数最多的图是具有 ii 个点的完全 jj 分图(即上面构造的图的补图)。

现在还有一个问题:朴素 dp 是 O(tn2)O(tn2) 的,会 T。暴力枚举发现 ww 满足四边形不等式。这一点可以证明:

往证 ∀j<i∀j<i 有

w(j,i)+w(j+1,i+1)≤w(j+1,i)+w(j,i+1)w(j,i)+w(j+1,i+1)≤w(j+1,i)+w(j,i+1)

移项,得

w(j+1,i+1)−w(j+1,i)≤w(j,i+1)−w(j,i)w(j+1,i+1)−w(j+1,i)≤w(j,i+1)−w(j,i)

w(j,i+1)−w(j,i)=(⌊i/j⌋+12)−(⌊i/j⌋2)w(j,i+1)−w(j,i)=(2⌊i/j⌋+1​)−(2⌊i/j⌋​)

代入原式,得

(⌊i/(j+1)⌋+12)−(⌊i/(j+1)⌋2)≤(⌊i/j⌋+12)−(⌊i/j⌋2)(2⌊i/(j+1)⌋+1​)−(2⌊i/(j+1)⌋​)≤(2⌊i/j⌋+1​)−(2⌊i/j⌋​)

⌊i/(j+1)⌋≤⌊i/j⌋⌊i/(j+1)⌋≤⌊i/j⌋

该式恒成立,因此原式成立。证毕。

于是决策单调性成立,可以用分治算法优化到 O(tnlog⁡n)O(tnlogn)。发现 f8,N=1099944f8,N​=1099944,恰好满足限制,从而通过本题。

Code

#include "richest.h"
#include <vector>
#include <bitset>
#define rep(i,a,b) for(int i(a);i<b;++i)
#define rept(i,a,b) for(int i(a);i<=b;++i)
#define eb emplace_back
#define ll long long
#define il inline
using namespace std;
namespace{
constexpr ll INF=1e16;
int N,T,S;
bool INITED;
}
namespace Case1{
constexpr int MAXN=1000;
bitset<MAXN> mk;
vector<int> A,B,C;
int solve(){
if(!INITED){
A.reserve(499500);
B.reserve(499500);
C.reserve(499500);
INITED=true;
}
mk.reset();
A.clear(),B.clear();
rep(i,0,N-1) rep(j,i+1,N) A.eb(i),B.eb(j);
C=ask(A,B);
rep(i,0,499500) mk.set(C[i]==A[i]?B[i]:A[i]);
rep(i,0,N) if(!mk[i]) return i;
return 0;
}
}
namespace Case2{
constexpr int MAXN=1e6+1;
ll f[9][MAXN];
int g[9][MAXN];
bitset<MAXN> mk;
vector<int> A,B,C,D;
il ll comb(ll x){
return x*(x-1)/2;
}
il ll w(int m,int n){
int a=n/m,b=n%m;
return (m-b)*comb(a)+b*comb(a+1);
}
void calc(int k,int l,int r,int opt_l,int opt_r){
int i=l+r>>1;
g[k][i]=opt_l;
rept(j,opt_l,min(opt_r,i-1)){
if(f[k-1][j]+w(j,i)<f[k][i]){
f[k][i]=f[k-1][j]+w(j,i);
g[k][i]=j;
}
}
if(l<i) calc(k,l,i-1,opt_l,g[k][i]);
if(r>i) calc(k,i+1,r,g[k][i],opt_r);
}
int solve(){
mk.reset();
if(!INITED){ // 仅在初始时运行一次dp
fill(f[0]+2,f[0]+N+1,INF);
rept(k,1,8){
fill(f[k]+1,f[k]+N+1,INF);
calc(k,1,N,1,N);
}
A.reserve(f[8][N]),B.reserve(f[8][N]);
C.reserve(f[8][N]),D.reserve(f[8][N]);
INITED=true;
}
int k=8,n=N;
while(n>1){
int m=g[k][n];
int len=w(m,n),a=n/m,b=n%m,p=0;
A.clear(),B.clear(),D.clear();
rep(_,0,m-b){
while(D.size()<a){
if(!mk[p]) D.eb(p);
++p;
}
rep(i,0,D.size()-1){
rep(j,i+1,D.size()){
A.eb(D[i]),B.eb(D[j]);
}
}
D.clear();
}
rep(_,0,b){
while(D.size()<a+1){
if(!mk[p]) D.eb(p);
++p;
}
rep(i,0,D.size()-1){
rep(j,i+1,D.size()){
A.eb(D[i]),B.eb(D[j]);
}
}
D.clear();
}
C=ask(A,B);
rep(i,0,len){
int u=C[i]==A[i]?B[i]:A[i];
if(!mk[u]) mk.set(u),--n;
}
--k;
}
rep(i,0,N) if(!mk[i]) return i;
return 0;
}
}
int richest(int _N,int _T,int _S){
N=_N,T=_T,S=_S;
return N==1000?Case1::solve():Case2::solve();
}

分类: 题解

免责声明:本内容来自平台创作者,博客园系信息发布平台,仅提供信息存储空间服务。

好文要顶 关注我 收藏该文 微信分享

xiaoniu142857
粉丝 - 1 关注 - 0

+加关注

0

0

升级成为会员

« 上一篇: 洛谷-P7998 [WFOI - 01] 猜数 题解
» 下一篇: 洛谷-P11942 [KTSC 2025] 重塑矩阵 题解

posted @ 2026-05-16 22:41 xiaoniu142857 阅读(80) 评论(1) 收藏 举报

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 2:19:15

偏函数与柯里化:函数式编程技巧

如果你写过一段时间的代码,尤其是接触过函数式编程(Functional Programming),那么你一定听说过「柯里化」(Currying)和「偏函数」(Partial Application)这两个术语。它们听起来像是数学课本里的概念,但实际上,它们是日常开发中非常实用的技巧,能够让你的代码更灵活、…

作者头像 李华
网站建设 2026/6/26 2:14:55

【随笔】为什么要读书?

为什么要读书&#xff1f;——两个被严重低估的理由“读一本好书&#xff0c;是和许多高尚的人谈话。”——歌德 但歌德没说完的是&#xff1a;你还偷走了他们几十年的时间&#xff0c;以及他们用命换来的秘密。写在前面&#xff1a;大多数人对读书的理解&#xff0c;停留在表面…

作者头像 李华
网站建设 2026/6/26 2:11:31

大模型推理加速:从 KV Cache 到 Continuous Batching 的实战复盘

大模型推理加速&#xff1a;从 KV Cache 到 Continuous Batching 的实战复盘一、深夜告警&#xff1a;GPU 没跑满&#xff0c;请求却在排队 某天凌晨&#xff0c;监控面板突然报警——线上 LLM 推理服务的 P99 延迟从 800ms 飙到了 4.2s。排查下来发现&#xff0c;并发量从 50 …

作者头像 李华
网站建设 2026/6/26 2:09:35

AI 驱动增长营销:从内容生成到用户转化的工具链与效果评估

AI 驱动增长营销&#xff1a;从内容生成到用户转化的工具链与效果评估 一、AI 营销的效率幻觉&#xff1a;生成不等于转化 AI 营销工具的普及带来了一个危险的幻觉&#xff1a;内容生产效率的提升等同于营销效果的提升。一个团队用 AI 每天生成的文章从 2 篇增加到 20 篇&#…

作者头像 李华
网站建设 2026/6/26 2:08:59

AI 交互体验设计:从意图理解到智能响应的用户体验优化

AI 交互体验设计&#xff1a;从意图理解到智能响应的用户体验优化一、AI 交互的信任裂缝&#xff1a;当智能变成"智障"的体验塌方 在一个 AI 写作助手的用户调研中&#xff0c;最频繁的投诉不是"AI 写得不好"&#xff0c;而是"AI 不理解我想要什么&qu…

作者头像 李华
网站建设 2026/6/26 2:06:58

AI 模型云原生部署:从 GPU 调度到推理服务弹性伸缩的实战路径

AI 模型云原生部署&#xff1a;从 GPU 调度到推理服务弹性伸缩的实战路径 一、GPU 资源浪费过半——AI 推理上云的第一道坎 AI 模型部署到 K8s&#xff0c;最扎心的现实&#xff1a;GPU 利用率不到 40%。模型推理服务白天高峰需要 4 张 A100&#xff0c;凌晨低谷只需要 1 张&am…

作者头像 李华