惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
小众软件
小众软件
WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)
博客园_首页
N
Netflix TechBlog - Medium
IT之家
IT之家
H
Help Net Security
博客园 - 聂微东
Google DeepMind News
Google DeepMind News
罗磊的独立博客
T
Tailwind CSS Blog
F
Fortinet All Blogs
Hugging Face - Blog
Hugging Face - Blog
MongoDB | Blog
MongoDB | Blog
V
V2EX
量子位
云风的 BLOG
云风的 BLOG
爱范儿
爱范儿
博客园 - 司徒正美
The Cloudflare Blog
Engineering at Meta
Engineering at Meta

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
洛谷-P7998 [WFOI - 01] 猜数 题解
xiaoniu14285 · 2026-05-14 · via 博客园_首页

Solution

交互库自适应,也就是它会尽量使你的代码进行尽量多的交互,从而卡掉一些诸如随机化的做法。

显然我们需要通过询问不断缩小查找范围。假设当前已经确定 \(q\in [1,n]\),如果询问 \((l,r)\),那么交互库返回“比 \(l\) 大”或“比 \(r\) 小”就可以使下一轮区间长度为 \(\max(r-1,n-l)\),取到最大值。

于是有性质:询问的区间必须满足 \(r-1=n-l\)。否则可以拓展小的一边使 \(\max(r-1,n-l)\) 不变而区间长度增加,得到更优解。

\(1.9813035\) 这样的奇怪限制启发我们考虑 dp。设 \(f_i\) 为长度为 \(i\) 的区间确定唯一值的最小代价。若一次询问后区间长度缩减到 \(j\),则 \(l=i-j-1,r=j+1\)。于是转移方程为:

\[f_i=\min_{\left\lceil\frac{i-1}{2}\right\rceil\le j<i}f_j+\frac{1}{2j-i+2} \]

直接跑 dp 是 \(O(n^2)\) 的,期望得分 \(70\)

我们可以证明代价函数满足四边形不等式。因此 dp 具有决策单调性,二分队列算法可以在 \(O(n\log n)\) 复杂度内解决本题。

Code

#include <bits/stdc++.h>
#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 db double
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
namespace{
    constexpr int N=1e5+5;
    deque<int> q;
    int n,l[N],r[N],g[N];
    db f[N];
}
inline const pii ask(int l,int r){
    cout<<"? "<<l<<' '<<r<<endl;
    pii res;
    cin>>res.fi>>res.se;
    return res;
}
inline void submit(int x){
    cout<<"! "<<x<<endl;
    exit(0);
}
inline db w(int j,int i){
    return f[j]+1.0/(2*j-i+2);
}
inline int rb(int i){  // i能更新到的最右边界
    return min(n,i<<1|1);
}
inline bool check(int i,int j){  // i是否能更新j
    return i<j&&rb(i)>=j;
}
int main(){
    cin>>n;
    if(n==1) submit(1);
    l[1]=2,r[1]=rb(1);
    q.push_back(1);
    rept(i,2,n){
        while(!q.empty()&&r[q.front()]<i) q.pop_front();
        g[i]=q.front();
        f[i]=w(g[i],i);
        while(!q.empty()&&check(i,l[q.back()])&&w(i,l[q.back()])<w(q.back(),l[q.back()])) q.pop_back();
        if(q.empty()){
            l[i]=i+1,r[i]=rb(i);
            q.emplace_back(i);
        }else if(!check(i,r[q.back()])||w(i,r[q.back()])>=w(q.back(),r[q.back()])){
            if(r[q.back()]<rb(i)){
                l[i]=r[q.back()]+1,r[i]=rb(i);
                q.emplace_back(i);
            }
        }else{
            int L=l[q.back()],R=r[q.back()],mid;
            while(L<R){
                mid=L+R>>1;
                if(check(i,mid)&&w(i,mid)<w(q.back(),mid)) R=mid;
                else L=mid+1;
            }
            r[q.back()]=L-1;
            l[i]=L,r[i]=rb(i);
            q.emplace_back(i);
        }
    }
    int L=1,R=n;
    while(true){
        if(L==R) submit(L);
        int t=R-L+1-1-g[R-L+1];
        pii res=ask(L+t,R-t);
        if(res.se==1) submit(res.fi);
        if(res.se==0) L=res.fi+1;
        else R=res.fi-1;
    }
    return 0;
}