P14462 【MX-S10-T3】『FeOI-4』寻宝游戏

news/2025/11/9 17:55:10/文章来源:https://www.cnblogs.com/XP3301Pipi/p/19204566

P14462 【MX-S10-T3】『FeOI-4』寻宝游戏

P14462 【MX-S10-T3】『FeOI-4』寻宝游戏 - 洛谷 (luogu.com.cn)

分类讨论。

  • \(len\ge 3\)

    找到一个目标桶 \(x\),把剩下的都扔进去。

    设剩下的桶之中,个数和为 \(sum\),最大的有 \(mx\) 个。

    • \(sum\) 为偶数。

      可以直接向 \(x\) 里扔。一个下界为 \(\max(sum/2,mx)\),考虑构造出这个下界:

      • \(sum/2\ge mx\),每次拿出最大和次大的向 \(x\) 扔,一定可行。
      • 否则,先不断地拿 \(mx\) 和其他一个桶向一个空桶扔,直到 \(sum/2\ge mx\),需要 \(mx\) 次操作。
    • \(sum\) 为奇数。

      • \(x\) 不是空桶。

        先拿出 \(x\)\(mx\) 向空桶扔,然后变为上面的问题。

        \(x\) 剩下的桶中次大值为 \(se\)

        • \(mx=se\),答案为 \(\max((sum+1)/2,mx,2)+1\)
        • 否则,答案为 \(\max((sum+1)/2,mx-1,2)+1\)
      • \(x\) 是空桶

        讨论起来就麻烦很多,但答案只会是 \(\max((sum-1)/2,mx-d,2)+2\),其中 \(d\in \{0,1,2\}\)

        无论 \(d\) 取何值,都不比选一个非空桶优,所以不需要考虑。

  • \(len=1\),平凡。

  • \(len=2\)

    设两个桶里有 \(x,y\) 个,不妨设 \(x\le y\)

    首先只有两个桶是没办法做的,需要一个空桶转换为 \(len\ge 3\) 的情况。

    • \(x=1,y=1\),答案为 \(1\)
    • \(x=1,y=2\),无解。
    • \(x>1\),用一步操作变为 \(x-1,y-1,2\)
    • \(x=1\),用两步操作变为 \(2,y-2,1\)
    • \(x+y\) 为偶数,答案还要考虑 \(\max((x+y)/2,x,y)\)

对于 \(len\ge 3\) 的情况,只有区间最大值和严格次大值有可能成为目标。st 表或线段树均可。

int n,m,a[N];
ll s[N];struct Info{int f,pf,g,pg,h; //最大值,出现位置,严格次大值,出现位置,非严格次大值friend Info operator + (Info x,Info y){Info z;if(x.f==y.f){z.f=x.f,z.pf=x.pf;if(x.g>=y.g) z.g=x.g,z.pg=x.pg;else z.g=y.g,z.pg=y.pg;z.h=y.f;}else if(x.f>y.f){z.f=x.f,z.pf=x.pf;if(x.g>=y.f) z.g=x.g,z.pg=x.pg;else z.g=y.f,z.pg=y.pf;z.h=max(x.h,y.f);}else{z.f=y.f,z.pf=y.pf;if(y.g>=x.f) z.g=y.g,z.pg=y.pg;else z.g=x.f,z.pg=x.pf;z.h=max(y.h,x.f);}return z;} 
}tr[N<<2];void Buildtr(int p,int l,int r){if(l==r){tr[p].f=a[l],tr[p].h=-IINF;tr[p].pf=l,tr[p].g=-IINF,tr[p].pg=-1;return;}int mid=(l+r)>>1;Buildtr(p<<1,l,mid),Buildtr(p<<1|1,mid+1,r);tr[p]=tr[p<<1]+tr[p<<1|1]; 
}Info Ask(int p,int l,int r,int L,int R){if(L>R) return Info{-IINF,-1,-IINF,-1,-IINF};if(L<=l&&r<=R) return tr[p];int mid=(l+r)>>1;if(L<=mid&&mid<R)return Ask(p<<1,l,mid,L,R)+Ask(p<<1|1,mid+1,r,L,R);else if(L<=mid) return Ask(p<<1,l,mid,L,R);else return Ask(p<<1|1,mid+1,r,L,R);
} ll Calc(int x,int y){if((x+y)%2==0) return max((x+y)>>1,max(x,y));else{int mx=max(x,y),se=min(x,y);if(mx==se) return max((x+y+1)>>1,max(mx,2))+1;else return max((x+y+1)>>1,max(mx-1,2))+1;}
}ll Work0(int l,int r){if(a[l]==1&&a[r]==1) return 1;else if(a[l]==1&&a[r]==2) return -1;else if(a[l]==2&&a[r]==1) return -1;ll A=a[l],B=a[r],C=0,ans=0,res=LINF;if(A>B) swap(A,B);if(A==1) A=2,B-=2,C=1,ans=2;else --A,--B,C=2,ans=1;if((A+B+C)%2==0)Ckmin(res,max((A+B+C)>>1,max({A,B,C})));Ckmin(res,Calc(A,B));Ckmin(res,Calc(A,C));Ckmin(res,Calc(B,C));ans+=res; return ans;
}ll Work1(int l,int r){ll mx,se,sum,ans=LINF;Info all=Ask(1,1,n,l,r),res;int P=all.pf,Q=all.pg;if((s[r]-s[l-1])%2==0) Ckmin(ans,max((s[r]-s[l-1])>>1,(ll)all.f));res=Ask(1,1,n,l,P-1)+Ask(1,1,n,P+1,r);mx=res.f,se=res.h,sum=s[r]-s[l-1]-a[P];if(sum%2==0) Ckmin(ans,max(sum>>1,mx));else if(mx==se) Ckmin(ans,max((sum+1)>>1,max(mx,2ll))+1);else Ckmin(ans,max((sum+1)>>1,max(mx-1,2ll))+1);if(Q==-1) return ans;res=Ask(1,1,n,l,Q-1)+Ask(1,1,n,Q+1,r);mx=res.f,se=res.h,sum=s[r]-s[l-1]-a[Q];if(sum%2==0) Ckmin(ans,max(sum>>1,mx));else if(mx==se) Ckmin(ans,max((sum+1)>>1,max(mx,2ll))+1);else Ckmin(ans,max((sum+1)>>1,max(mx-1,2ll))+1);return ans;
}void Solve(){read(n),read(m);for(int i=1;i<=n;i++){read(a[i]);s[i]=s[i-1]+a[i];}Buildtr(1,1,n);while(m--){int l,r; read(l),read(r);if(l==r) puts("0");else if(l+1==r) printf("%lld\n",Work0(l,r));else printf("%lld\n",Work1(l,r));} 
}signed main(){int T; read(T);while(T--) Solve();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完整教程:FocusAny 发布v1.1.0 插件搜索过滤,FAD文件优化,插件显示MCP服务

完整教程:FocusAny 发布v1.1.0 插件搜索过滤,FAD文件优化,插件显示MCP服务pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

11.9 模拟赛 T3

题意:将 \(n\) 个线段分成恰好 \(m\) 组,每个线段需要且只能分进一组。求这 \(m\) 组线段合法的得分之和最大是多少。一组线段的得分定义为它们的交的长度(区间长度为右端点减左端点)。一个方案合法,当且仅当每组…

CSP2025游记

早上到考场发现那一层两个考场一共就看到两种校服。今年好像不是按姓名字典序排的 J组 挺水的 T1 简单切了 T2 简单切了 T3 想了一会,切了 T4 想了一会,以为自己切了 赛后发现没开滚动数组好像会爆空间($512 \times…

深入解析:从零构建鸿蒙高效数据恢复工具:完整实战教程与可运行Demo

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年安徽合肥智能家居公司推荐榜

摘要 随着智能家居行业的快速发展,2025年国内智能家居设备市场预计将达到千亿规模,消费者对智能家居品牌的选择日益注重口碑、实力和可靠性。本文基于行业数据和用户评价,为您推荐2025年安徽合肥地区智能家居公司排…

2025年智能家居设备厂家综合实力排行榜TOP5

文章摘要 随着智能家居行业的快速发展,2025年国内智能家居设备市场呈现出蓬勃发展的态势。本文基于权威数据和技术指标,对当前智能家居厂家的综合实力进行排名分析,为行业投资者和采购商提供参考依据。文章包含详细…

教育辅助系统开发需求文档 - f

教育辅助系统开发需求文档 1. 项目概述 本项目旨在开发一个集学生电子档案管理、行为矫正跟踪、教学任务管理与家校互动于一体的教育辅助系统。系统需包含教师端、家长端、学生端及后台管理端。2. 功能模块详述 2.1 电…

2025年11月合肥智能家居源头厂家排行

摘要 2025年,智能家居行业持续高速发展,全球市场规模预计突破2000亿美元,中国作为主要生产国,安徽合肥地区凭借产业集群优势成为重要基地。本文基于行业数据、用户口碑和技术实力,为您推荐2025年11月合肥智能家居…

完整教程:超越CNN:GCN如何重塑图像处理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:数据结构 04 栈和队列

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:软件编程课程:课程目录介绍 总纲

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Linux下wcout输出中文:迄今为止讲得最清楚的

#include <cstdint> #include <string> #include <iostream> #include <locale> #include <codecvt> using namespace std;wstring utf8_to_wchar(const string& str);int main() {…

CCPC哈尔滨站-J. 幻想乡的裁判长

statement 给一个长为 \(n\) 的字符串 \(s\),字符集为 \(\{\text{o, v, w}\}\),请输出最长的回文子串,这个子串中一个 \(\text{w}\) 可以看成两个 \(\text{v}\)。 给个例子:\(\text{wwovvvv}\) 是合法的。 数据范围…

C语言中的整型提升

整型提升 什么是整型提升?为什么要使用整型提升?整型提升是如何进行的? 1.整型提升 在c语言中,一些表达式在求值的过程中,操作数可能需要转换为其他类型,这种转换,我们程序员是看不见的,称其为隐式类型转换,而…

牛客网测试题

题目Java解题 public class test05 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while(scanner.hasNextLine()){String s = scanner.nextLine();char[] chars = s.toCharArra…

完整教程:Hive 知识点梳理

完整教程:Hive 知识点梳理2025-11-09 17:23 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

OZI-Project代码注入漏洞分析与修复方案

本文详细分析OZI-Project/ozi-publish中发现的代码注入漏洞CVE-2025-47271,涵盖漏洞影响范围、修复版本、CVSS评分及缓解措施,帮助开发者理解并防范类似安全风险。OZI-Project/ozi-publish 代码注入漏洞 CVE-2025-4…

创建第一个pygame游戏窗口

创建了一个pygame游戏窗口,并且通过循环不断的监听和响应用户事件 如果用户按下了按键就print一句话;如果是点了退出按钮就关闭窗口 import pygamepygame.init() size = (600, 400) screen = pygame.display.set_mod…

常量的二元图景:C 语言的刚性契约与 Python 的柔性表达

常量的二元图景:C 语言的刚性契约与 Python 的柔性表达 引言:被混淆的 “不变性”—— 从字面量与常量的认知错位说起 在程序设计基础教学里,“常量” 是最容易被 “简化到失真” 的概念。为了让初学者快速上手,很…

用 Swift 解析验证码(结合 Tesseract OCR)

环境准备 1.1 安装 SwiftmacOS 自带 Swift,如需更新,可使用: 更多内容访问ttocr.com或联系1436423940 xcode-select --install 然后检查 Swift 版本: swift --version Linux 用户可以从 Swift 官方网站 下载对应版…