P10786 [NOI2024] 百万富翁

news/2024/10/9 10:19:56

思路:

先考虑 Sub1 的部分分,暴力算法:

暴力询问所有 \(i<j\) 的数对 \((i,j)\)
则一个 \(i\) 为最大值当且仅当 \((i,j)\) 的返回值都是 \(i\) 且在 \(i\) 之前没有满足此条件的位置。

则设 \(\operatorname{F}(n) = \frac{n(n-1)}{2}\) 表示暴力找出 \(n\) 个数中的最大值需要的询问次数,注意到 \(\operatorname{F}(1000) = 499500\),故可以通过 Sub1。

对于 Sub2,直接暴力肯定是不行的,但是注意到 \(t\) 的值开大了,故我们没必要一步到位,可以逐步缩小范围。

定义 \(\operatorname{W}(a,b)\) 表示原先最大值候选有 \(a\) 个,经过一次请求筛到 \(b\) 个候选人的最小询问次数;考虑分为 \(b\) 组,每组有 \(\lfloor \frac{a}{b} \rfloor \sim \lceil \frac{a}{b} \rceil\) 人,故:

\[\operatorname{W}(a,b) = (b - b\bmod a) \operatorname{F}(\lfloor \frac{a}{b} \rfloor) + (b \bmod a) \operatorname{F}(\lceil \frac{a}{b} \rceil) \]

现在我们的目的就是找到一个合理的筛检最大值候选的序列 \(h\),使得长度 \(len \le t\)\(\sum\limits_{i=1}^{len-1} \operatorname{W}(h_i,h_{i+1}) \le s\)

爆搜经过实测可以搜到 \(t=9\) 的情况,在 \(t=8\) 时几乎无法跑出来。

考虑动态规划算法,令 \(dp_{i,j}\) 表示 \(W_i = j\) 的情况下的最小询问数,则状态转移方程为:

\[dp_{i,j} = \min_{k=j+1}^n dp_{i-1,k} + \operatorname{W}(k,j) \]

时间复杂度为 \(O(tn^2)\),大概有 \(10^{13}\),按照最低预算,计算机 1s 可以跑 \(10^8\),则 \(\frac{10^{13}}{10^{8}} = 10^5\),则 \(\frac{10^5}{64^2} \approx 24\),大概要跑 \(1\) 天的时间,是肯定不行的。

可以有一个猜想,每次候选人的数量至少要减半,这样一定不会太劣,这样我们就将范围个缩小了,对于 \(dp_{i,j}\) 有效的 \(j\) 只有 \(\frac{n}{2^{i-1}}\),枚举的 \(k\) 大概是 \((j,2j]\),这样大概可以缩到 \(10^{11}\) 左右,可以在 1h 内跑完。

最后根据我们得到的 \(h\) 模拟一下分组求最大值的过程即可。

单组数据时间复杂度最多为 \(O(Nt)\)

完整代码:

#include<bits/stdc++.h>
#define Add(x,y) (x+y>=mod)?(x+y-mod):(x+y)
#define lowbit(x) x&(-x)
#define pi pair<ll,ll>
#define pii pair<ll,pair<ll,ll>>
#define iip pair<pair<ll,ll>,ll>
#define ppii pair<pair<ll,ll>,pair<ll,ll>>
#define fi first
#define se second
#define full(l,r,x) for(auto it=l;it!=r;it++) (*it)=x
#define Full(a) memset(a,0,sizeof(a))
#define open(s1,s2) freopen(s1,"r",stdin),freopen(s2,"w",stdout);
#define For(i,l,r) for(int i=l;i<=r;i++)
#define _For(i,l,r) for(int i=r;i>=l;i--)
using namespace std;
typedef double db;
typedef unsigned long long ull;
typedef long long ll;
const int maxn=1e6+10;
std::vector<int> ask(std::vector<int> a, std::vector<int> b);
int n;
vector<int> a,b,h;
namespace Sub1{int cnt=0;int work(){a.clear(),b.clear();cnt=0;vector<int> l(n,0),r(n,0);For(i,0,n-1){l[i]=cnt;For(j,i+1,n-1){a.push_back(i);b.push_back(j);++cnt;}r[i]=cnt-1;}h=ask(a,b);For(i,0,n-1){bool F=1;For(j,l[i],r[i]){if(h[j]!=i){F=0;break;}}if(F)return i;}return 0;}
};
namespace Sub2{int cnt=0;int s[maxn];vector<int> E[maxn];stack<int> S;int p[]={1000000,500000,250000,125000,62498,20832,3472,183,1};void solve(int x){s[x]=a.size();int n=E[x].size();For(i,0,n-1){For(j,i+1,n-1){a.push_back(E[x][i]);b.push_back(E[x][j]);}}}int get(int x){int g=s[x],n=E[x].size();For(i,0,n-1){bool F=1;For(j,i+1,n-1)if(h[g++]!=E[x][i])F=0;if(F)return E[x][i];}return 0;}void get(int X,int Y){cnt=0;int l=0,cnt=0,g=0,B=X/Y;For(i,1,Y)E[i].clear();while(!S.empty()){++l;int x=S.top();S.pop();if((l-1)/B+1!=cnt)++cnt;if(cnt<=Y)E[cnt].push_back(x);else{++g;E[g].push_back(x);}}For(i,1,Y)solve(i);h=ask(a,b);For(i,1,Y){int x=get(i);S.push(x);}}int work(){while(!S.empty())S.pop();_For(i,0,n-1)S.push(i);For(i,1,8){a.clear(),b.clear();get(p[i-1],p[i]);}return S.top();}
};
int richest(int N,int T,int S){n=N;if(n<=1000)return Sub1::work();elsereturn Sub2::work();
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

基于PSO粒子群算法的三角形采集堆轨道优化matlab仿真

1.程序功能描述 假设一个收集轨道,上面有5个采集堆,这5个采集堆分别被看作一个4*20的矩阵(下面只有4*10),每个模块(比如:A31和A32的元素含量不同),为了达到采集物品数量和元素含量的要求(比如:需采集5吨和某元素单位质量在65与62之间),求出在每个4*20的矩阵…

用我十多年的“奇葩”经验,给在“挂吊瓶”的博客园几点建议

初识博客园 我是08年开始接触开发的,一开始涉及的就是.net和java,记得那会好像是jar6来着,net嘛还是2.0 那时候包括现在,找资料很多时候会找到博客园来 一开始我以为博客园是很多博主成立的一个联盟,就是各自弄一个博客系统,然后公用一个域名 为啥会这么想呢? 因为我看高…

基于深度学习网络的USB摄像头实时视频采集与水果识别matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印)将usb摄像头对准一个播放不同水果图片的显示器,然后进行识别,识别结果如下: 本课题中,使用的USB摄像头为:2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)程序中包括MATLAB读取摄…

Android 常用的性能分析工具详解:GPU呈现模式

此篇将重点介绍几种常用的Android性能分析工具: 一、Logcat 日志 选取Tag=ActivityManager,可以粗略地知道界面Displaying的时间消耗。当我们打开一个Activity的时候,log会打印一串log如下: I/ActivityManager﹕ Displayed xxx.xxx.xxx/TestActivity: +1s272ms (total +3s…

两种解决powerdesigner概念模型转物理模型报字段重复错误的方法

问题 使用 powerdesigner 概念模型转物理模型时会报一个不能重复的错误解决方法 一、取消勾选Unique code取消勾选以后保存,再一次生成物理模型。 二、取消勾选Entity Attribute,不对属性进行检查 如果Unique code取消勾选后依旧不行,可以尝试第二种解决办法。取消勾选以后点…

AT cf17 final J Tree MST

AT cf17 final J Tree MST 考场上想出的黑题,然而写挂了…… 思路 考场推出 boruvka 算法,会的直接跳过就好。 结论:一个点向另外一个点连出的最小边,一定在最小生成树上。 证明:参考 Kruskal 生成树的流程,若当前边(最小边)不在最小生成树上,表明边的两端已经在同一个…

EPIC Institute of Technology Round Summer 2024 (Div. 1 + Div. 2) VP记录

EPIC Institute of Technology Round Summer 2024 (Div. 1 + Div. 2) VP记录 A 一眼 \((n - 1) m + 1\)。 B 最后的数列是固定的,每个数与最后数列的数相减后,对差值求和再加上最大值即可。 C 唐诗 C 题,获得 \(3\) 发罚时。 只有一个数右边的数归零了,它才会归零。 右往左…