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

P15499 [ICPC 2025 APC] Secret Lilies and Roses 题解

题目链接:[https://www.luogu.com.cn/problem/P15499](P15499 [ICPC 2025 APC] Secret Lilies and Roses)

很厉害的一道题。

显然如果我们知道玫瑰的数量 $ m $,则回答 $ m $ 一定可行。考虑如何求出玫瑰的数量,一个可行的方案是找到一个连续的玫瑰-百合,设玫瑰的位置为 $ p $,则询问 multi(p)multi(p+1),记回答分别为 $ x, y $ 有玫瑰的数量等于 $ (y-x)+p-(x/(y-x)) $,但是显然这在 $ y=0 $,即位置 $ p $ 是最后一朵玫瑰的时候是错误的,那么我们询问 multi(p-1),记回答为 $ z $,即为前 $ p-1 $ 个位置中百合的数量,因此有玫瑰的数量等于 $ p-1-z+1=p-z $。这里最多消耗三次询问。

考虑如何找到一个玫瑰-百合,我们假设位置 0 有一个玫瑰,位置 n+1 有一个百合,那么可以二分(这步很难想到!),当前 $ l, r $ 的值代表位置 $ l-1 $ 是一个玫瑰,位置 $ r+1 $ 是一个百合,每次询问 $ mid $ 的具体类别并替换可以替换的 $ l $ 或 $ r $。这里用了最多 $ \lceil \log_2n \rceil = 7 $ 次询问。

很明显这还是有问题的,如果找到的区间包含假设的玫瑰和百合那么久不成立了,但是注意到这意味着如果取到了最左边的区间那么有第一个位置是百合。取到最右边的区间那么有最后一个位置是玫瑰,都可以通过一次询问解决,具体见代码。

代码:

#include<bits/stdc++.h>
#define time(null) chrono::steady_clock::now().time_since_epoch().count()
#define int long long
#define uint unsigned long long
#define debug() cout<<"come here\n"
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define pb push_back
#define Code return
#define by 0
#define MCYYDS ;
using namespace std;
int qpow(int a,int b,int p=INF){int ret=1;while(b){if(b&1)ret=(ret*a)%p;a=(a*a)%p;b>>=1;}return ret;}
inline int read(){int ret=0,f=1;char ch=getchar();while(ch<'0'||ch>'9')f=(ch=='-'?-1:f),ch=getchar();while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+(ch^48),ch=getchar();return ret*f;}
inline void write(int x){if(x<0){putchar('-');write(-x);return ;}if(x>9)write(x/10);putchar((char)(x%10+48));}
inline void writech(int x,char ch){write(x);putchar(ch);}
bool typ(int x)
{cout<<"type "<<x<<endl;string s;cin>>s;return (s[0]=='l');
}
int mul(int x)
{cout<<"multi "<<x<<endl;int y;cin>>y;return y;
}
void ans(int x)
{cout<<"answer "<<x<<endl;return ;
}
signed main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	cout.tie(0);int T;cin>>T;while(T--){int n;cin>>n;int l=1,r=n;while(l<=r){int mid=l+r>>1;if(typ(mid))r=mid-1;else l=mid+1;}swap(l,r);if(l!=0&&r!=n+1){int x=mul(l),y=mul(r);int ri=y-x;if(ri==0){ans(l-mul(l-1));}else{int li=x/ri;ans(ri+l-li);}}else if(l==0){ans(mul(1));}else if(r==n+1){ans(n-mul(n-1));}}Code by MCYYDS
}
http://www.jsqmd.com/news/1176664/

相关文章:

  • Lite³ 设计哲学:为什么选择无模式架构和 JSON 兼容性
  • MediaCrawler:5分钟搞定5大平台数据采集,无需破解加密算法
  • HarmonyOS APP实战-画图APP - 第7篇:文本绘制功能
  • 2026年7月最新金华美度官方售后客服服务电话及地址网点大全 - 亨得利钟表维修中心
  • 【UniApp小程序知识点总结】Vue3 与 Uniapp 中 defineProps 的对比
  • Java基础篇一(认识Java,DOS命令,标识符,关键字,数据类型,变量,常量,类型转换,运算符,程序控制结构)
  • 2026 年 7 月新发布:昌吉州靠谱的衬塑钢管厂商电话,揭秘!这些钢管如何悄悄颠覆你的工业成本? - 行业推荐官[官方】--
  • 北京5天4晚定制游旅行社推荐:主流企业盘点 - 优企名品
  • TD-MPC2数据集使用指南:如何利用300+预训练模型
  • 免费数字人平台怎么选?实测7款后,这4类人群的推荐顺序完全不同
  • 焊接产线数字孪生:从“盲焊“到数据驱动
  • HarmonyOS APP实战-画图APP - 第8篇:图像效果应用(亮度/模糊/灰度)
  • 【第1篇-环境安装】unreal engine + airsim
  • 3分钟上手B站会员购抢票神器:biliTickerBuy完整使用指南
  • Open Source Candies设计资源大全:免费图标、图片和字体资源推荐
  • RoomAliveToolkit深度技术解析:Gray Code编码与Levenberg-Marquardt优化算法
  • 3分钟上手:Qu1cksc0pe恶意软件分析工具全攻略 [特殊字符]
  • 5步掌握AI绘画提示词生成神器:Clip Interrogator创意高效指南
  • Android旋转选择器CursorWheelLayout事件处理完全指南:点击与选中监听
  • 从吃灰到生产力:如何用Armbian让你的旧电视盒子变身全能Linux服务器
  • 动态规划-01背包(模板)、完全背包(模板)、多重背包1(模板)、多重背包2(模板)、背包与魔法、砝码称重
  • 如何用Buzz实现完全离线的音频转录?免费开源工具终极指南
  • Jackhammer源码架构深度解析:Java后端与可扩展设计原理
  • 超级电容壳体激光封焊:AIDC供电安全的最后一道防线
  • AIGC 检测看的是句子结构还是用词?搞懂再改才不白费
  • 逆向工具箱 - 次元剑
  • 企业资质代办甄选合规机构推荐:北京孵财管理咨询 - 余小铁
  • 2026年7月最新昆明宇舶官方售后热线及客户服务网点地址 - 亨得利官方服务中心
  • Netgraph API完全参考:从Graph到ArcDiagram,掌握所有类与方法
  • OurJS完全指南:基于Node.js与Redis的免费博客引擎与CMS平台入门