news 2026/4/18 7:34:15

洛谷 P9100 [PA 2020] Miny 题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
洛谷 P9100 [PA 2020] Miny 题解

这道题难点在于状态设计。考虑线性 DP,设d p i dp_idpi为仅考虑前i ii个地雷且钦定第i ii个不引爆的方案数。这样设计的好处在于i ii前面的地雷一定不会引爆i ii后面的,从而满足无后效性。

注意需要在左右无穷远处各添加一个爆炸半径无穷大的哨兵地雷,下标分别为0 00n + 1 n+1n+1,确保哨兵能引爆所有地雷。答案即为d p n + 1 dp_{n+1}dpn+1

然后考虑转移。对于每个i ii,枚举所有j < i j<ij<i,然后判断引爆[ j + 1 , i − 1 ] [j+1,i-1][j+1,i1]中所有地雷是否会引爆i iij jj。若均不会则能转移,令d p i ← d p i + d p j dp_i\leftarrow dp_i+dp_jdpidpi+dpj

尝试转化这个条件。设l i l_ilii ii左边第一个会引爆i ii的地雷,r i r_iri同理。则上述条件等价于j ≥ l i j\ge l_ijlii ≤ r j i\le r_jirj

l , r l,rl,r两个数组都可以单调栈上二分处理。

然后状态转移方程如下。
d p i = ∑ j = l i i − 1 [ i ≤ r j ] ⋅ d p j = ∑ j = 0 i − 1 [ i ≤ r j ] ⋅ d p j − ∑ j = 0 l i − 1 [ i ≤ r j ] ⋅ d p j \begin{aligned} dp_i&=\sum_{j=l_i}^{i-1}[i\le r_j]\cdot dp_j\\ &=\sum_{j=0}^{i-1}[i\le r_j]\cdot dp_j-\sum_{j=0}^{l_i-1}[i\le r_j]\cdot dp_j\\ \end{aligned}dpi=j=lii1[irj]dpj=j=0i1[irj]dpjj=0li1[irj]dpj

先离线,把d p i dp_idpi的两个询问分别挂在i − 1 i-1i1l i − 1 l_i-1li1上,然后树状数组扫一遍即可。需要特殊处理j = 0 j=0j=0的情况。

时间复杂度O ( n log ⁡ n ) O(n\log n)O(nlogn)

#include<bits/stdc++.h>#definerept(i,a,b)for(inti(a);i<=b;++i)#definepert(i,a,b)for(inti(a);i>=b;--i)#definelowbit(x)((x)&-(x))#defineebemplace_back#defineintlonglongusingnamespacestd;constexprintN=3e5+5,P=1e9+7,INF=3e18;structitem{intp,rad,lb,rb;}a[N];structquery{query()=default;query(int_id,int_k):id(_id),k(_k){}intid,k;};intdp[N],st[N],l[N],r[N],s[N],n,top;vector<query>q[N];voidadd(intp,intx){while(p<=n+1)s[p]+=x,p+=lowbit(p);}intask(intp){intres=0;while(p)res+=s[p],p^=lowbit(p);returnres;}signedmain(){cin.tie(0)->sync_with_stdio(0);cin>>n;a[0]={-INF,INF,-INF,INF};a[n+1]={INF,INF,-INF,INF};r[0]=r[n+1]=n+1;dp[0]=1;rept(i,1,n){cin>>a[i].p>>a[i].rad;a[i].lb=a[i].p-a[i].rad;a[i].rb=a[i].p+a[i].rad;}st[top=1]=0;rept(i,1,n){intL=1,R=top,mid;while(L<R){mid=L+R+1>>1;a[st[mid]].rb>=a[i].p?L=mid:R=mid-1;}l[i]=st[L];while(a[st[top]].rb<a[i].rb)--top;st[++top]=i;}st[top=1]=n+1;pert(i,n,1){intL=1,R=top,mid;while(L<R){mid=L+R+1>>1;a[st[mid]].lb<=a[i].p?L=mid:R=mid-1;}r[i]=st[L];while(a[st[top]].lb>a[i].lb)--top;st[++top]=i;}rept(i,1,n+1){if(!l[i])++l[i],++dp[i];// 特判从dp[0]转移if(l[i]>1)q[l[i]-1].eb(i,-1);if(i>1)q[i-1].eb(i,1);}rept(i,1,n+1){add(r[i],dp[i]);for(auto[id,k]:q[i]){(dp[id]+=k*(ask(n+1)-ask(id-1)))%=P;}}cout<<(dp[n+1]+P)%P;return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 16:02:19

全球股市估值与可持续城市垂直农业的关系

全球股市估值与可持续城市垂直农业的关系 关键词:全球股市估值、可持续城市垂直农业、经济关联、市场趋势、投资分析、农业发展、金融市场 摘要:本文旨在深入探讨全球股市估值与可持续城市垂直农业之间的关系。首先介绍了研究的背景、目的、预期读者等内容。接着阐述了核心概…

作者头像 李华
网站建设 2026/3/28 7:29:36

基于STM32单片机智能垃圾桶 烟雾金属检测 液晶垃圾显示 超声检测

目录STM32单片机智能垃圾桶系统概述烟雾检测模块金属检测模块液晶显示模块超声波测距模块系统软件设计电源与低功耗设计扩展功能源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;STM32单片机智能垃圾桶系统概述 该系统基于STM32单片机设…

作者头像 李华
网站建设 2026/3/25 18:45:08

基于STM32单片机智能手环 里程提醒 运动时间 GSM GPS 时钟血氧

目录STM32单片机智能手环功能概述里程提醒运动时间记录GSM通信GPS定位实时时钟&#xff08;RTC&#xff09;血氧检测硬件设计要点软件实现建议源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;STM32单片机智能手环功能概述 基于STM32单片…

作者头像 李华
网站建设 2026/4/16 11:50:40

环状路径计数——传球游戏

洛谷&#xff1a;传球游戏 dp[i][j]表示第i次传球传到第j人的方案数&#xff0c;状态转移方程为&#xff1a;dp[i][j] dp[i-1][j-1] dp[i-1][j1]

作者头像 李华
网站建设 2026/4/16 19:43:32

GraphRAG:让 RAG 看见“关系网络“的技术进化

GraphRAG是RAG技术的革命性进化&#xff0c;通过构建知识图谱和社区发现&#xff0c;使AI从"翻书找词"升级为"全知视角"。它解决了传统RAG无法理解实体关系的局限&#xff0c;能处理复杂关系分析和全局总结。尽管构建成本更高&#xff0c;但在需要关系理解…

作者头像 李华
网站建设 2026/4/18 3:43:04

跨端前端开发工程师:技术深度、实践与面试指南

中控技术股份有限公司 前端开发工程师(跨端方向) 职位信息 岗位职责 1、负责公司核心产品的跨端技术架构设计与开发,覆盖Android、iOS、微信/支付宝小程序、H5、Web 网页、鸿蒙(HarmonyOS)等多端场景; 2、主导跨端技术方案选型与落地(如 React Native、Flutter、UniApp、…

作者头像 李华