news 2026/3/8 1:47:47

洛谷 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/3/4 22:44:02

1.5万字硬核AI架构指南:从单体智能到系统智能的实战设计

正文开始&#xff1a; 回顾这两年的 AI 发展轨迹&#xff0c;你会发现两条截然不同却又并行不悖的主线&#xff1a; 一条是造脑路线&#xff1a;基础模型层&#xff08;Foundation Models&#xff09;的狂奔&#xff0c;各大厂商拼参数、拼算力&#xff0c;目标是通用人工智能…

作者头像 李华
网站建设 2026/2/26 23:46:11

Agent课题增长200% AICA第九期毕业并累计输送569名AI架构师

1月22日&#xff0c;由百度与深度学习技术及应用国家工程研究中心联合发起的AICA首席AI架构师培养计划&#xff08;以下简称“AICA”&#xff09;第九期毕业典礼在上海成功举办。经过为期8个月的实战培养&#xff0c;来自能源、制造、金融、交通、汽车等18个行业领域的80名学员…

作者头像 李华
网站建设 2026/3/3 4:53:30

4G通信模组和引擎应该怎么用?

在物联网与智能终端设备开发中&#xff0c;4G通信模组与主控引擎&#xff08;如MCU或应用处理器&#xff09;的协同工作是实现远程数据传输与设备联网的核心环节。正确配置通信接口、管理AT指令交互、处理数据收发流程&#xff0c;是确保稳定联网的关键。本文将系统讲解4G模组与…

作者头像 李华
网站建设 2026/3/7 11:24:43

快速上手Mobile库:几行代码搞定移动通信

在面向物联网的移动通信技术中&#xff0c;4G-Cat.1凭借其在性能、功耗与成本之间的优异平衡&#xff0c;已成为中低速连接场景的主流选择。LuatOS提供了Mobile核心库&#xff0c;帮助开发者高效管理设备通信。该库提供简洁易用的API接口&#xff0c;涵盖网络连接、状态监控与高…

作者头像 李华