题解 P1081 [NOIP2012 提高组] 开车旅行
1.题解 P3204 [HNOI2010] 公交线路
2.题解 P1081 [NOIP2012 提高组] 开车旅行
3.题解 P1477 [NOI2008] 假面舞会4.题解 P5234 [JSOI2012] 越狱老虎桥5.题解 P6544 [CEOI2014] Cake6.题解 P4041 [AHOI2014/JSOI2014] 奇怪的计算器7.题解 P4798 [CEOI2015 Day1] 卡尔文球锦标赛8.题解 P4799 [CEOI2015 Day2] 世界冰球锦标赛9.题解 P1295 [TJOI2011] 书架10.题解 P6281 [USACO20OPEN] Social Distancing S11.题解 P1190 [NOIP2010 普及组] 接水问题12.题解 P3976 [TJOI2015] 旅游13.题解 P8096 [USACO22JAN] Drought G14.题解P7302 [BZOJ2131][NOI1998] 免费的馅饼15.题解 [BZOJ3307] P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并16.题解 [BZOJ3339] P4137 Rmq Problem / mex17.题解 [SP179][BZOJ2919][Poi1998]Word equations18.题解 P5930 [POI1999] 降水19.题解 BZOJ2720: [Violet 5]列队春游20.题解P3830 [SHOI2012]随机树21.题解 P4755 Beautiful Pair22.题解 P9229 扩展九连环23.题解 P7165 [COCI2020-2021#1] Papričice24.题解 P7169 [eJOI2020 Day1] Exam25.题解「JOI 2014 Final」IOI 馒头26.题解 P9911 [COCI 2023/2024 #2] Kuglice27.题解 P6356 [COCI2007-2008#3] CUDAK28.题解 P7309 [COCI2018-2019#2] Kocka29.题解 P6548 [COCI2010-2011#2] IGRA30.题解 P6491 [COCI2010-2011#6] ABECEDA传送门。
题意
显然。
分析
先分析我们的询问。
对于第一个问题,我们可以枚举起点,计算出小 A 的路程总数,小 B 的路程总数,将比值比较即可求到答案、
对于第二个问题,就是某个起点下,最长为
因此,我们其实需要的操作只有一个:在某个起点,长度为
并且,得到这个操作的时间复杂度应当是
先想一下暴力应当如何打。
首先,我们用
inline void init() { for(int i=1; i<=n; ++i) { nxt[i][0]=nxt[i][1]=n+1; for(int j=i+1; j<=n; ++j) { if(dis(i,j)<dis(i,nxt[i][1])) nxt[i][1]=j; if(dis(i,j)==dis(i,nxt[i][1])&&h[nxt[i][1]]>h[j]) nxt[i][1]=j; if(dis(i,nxt[i][0])>dis(i,nxt[i][1])) swap(nxt[i][0],nxt[i][1]); if(dis(i,nxt[i][0])==dis(i,nxt[i][1])&&h[nxt[i][0]]>h[nxt[i][1]]) swap(nxt[i][0],nxt[i][1]); } swap(nxt[i][0],nxt[i][1]); } } int tot[2]; inline node solve(int now,int mx) { int flag=0; tot[1]=tot[0]=0; while(now<=n) { if(nxt[now][flag]>n) break; if(tot[1]+tot[0]+dis(nxt[now][flag],now)>mx) break; tot[flag]+=dis(nxt[now][flag],now); now=nxt[now][flag]; flag=!flag; } return <%tot[0],tot[1]%>; }
总时间复杂度:
接着分析正解。
此时,我们的两个部分都是超出我们的期望时间复杂度的,因此,我们需要分开优化。
一方面,优化预处理。
为了处理出最近的与次近的,我们使用 set 来处理。
因为我们当前节点的最近与次近实则只有当前剩余的数字距离当前节点的最近的几个之一。
因此,实则,我们在处理时只需要寻找在数字上与其相邻的四个节点即可。
此部分时间复杂度:
再优化询问的时间复杂度,可以发现,我们的暴力是一步一步跳跃的,尽管是有两种跳跃,但是我们不妨令两个合并成一个操作。
最后就可以用倍增来解决。
时间复杂度:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?