news 2026/5/3 6:21:22

洛谷 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/5/3 5:35:44

从零开始学大模型核心:向量嵌入技术完全指南

文章全面介绍了向量嵌入技术在大模型中的应用&#xff0c;包括词嵌入、文档嵌入、多模态嵌入等多种类型&#xff0c;以及向量索引、存储优化和相似度计算等关键技术。文章详细阐述了嵌入与向量数据库的协同关系&#xff0c;以及在大规模语义搜索、推荐系统、异常检测和RAG等场景…

作者头像 李华
网站建设 2026/5/1 16:30:29

双非二程序员的大模型逆袭之路:RAG与Agent技术学习指南

本文探讨双非二本科生在大模型应用开发领域的就业前景&#xff0c;指出尽管学历存在挑战&#xff0c;但行业对RAG和Agent技术人才需求旺盛&#xff0c;更看重实际技术能力而非学历。文章分析了企业招聘要求、薪资前景&#xff0c;并提供了系统学习路径&#xff0c;包括Python编…

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

21点,如何计算胜率高达75%

算法原理低牌&#xff08;2-6&#xff09;&#xff1a;1分低牌&#xff08;2-6&#xff09;在21点中通常对玩家有利&#xff0c;因为它们更可能帮助玩家接近21点&#xff08;如16218&#xff0c;16319等&#xff09;&#xff0c;而不会轻易导致爆牌。因此&#xff0c;当低牌被打…

作者头像 李华
网站建设 2026/5/1 2:21:36

基于STM32单片机智能药盒 定时定量提醒 GSM短信 蜂鸣器提醒

目录硬件组成功能实现软件设计应用场景扩展功能建议源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;硬件组成 STM32单片机&#xff1a;作为主控芯片&#xff0c;负责协调各模块工作&#xff0c;处理定时、定量逻辑及通信功能。GSM模块&…

作者头像 李华