Lanterns (dp 紫 线段树 二分 维护dp)

server/2024/9/24 3:43:40/

Lanterns - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

让所有点被覆盖,那么状态可以设计成覆盖一段前缀,并且中间不允许出现断点

由于CF崩了,所以暂时没提交代码。

记f(i) 为前 i 个灯笼点亮的最长前缀。

由于答案具有保留性,所以单调性成立。

由此推转移方程。

共鸣:i 与 t (i > t) 号灯,可以完全覆盖1至i ,条件 f(t)>= i - a[i] -1 至少自给自足。

max_range(l,r) 区间[l,r]最大的i + a[i]

  • f(i) = f(i-1) 如果前i-1盏灯无法覆盖i
  • 反之则让f(i) = max(f(i-1),i+a[i])
  • 第三种情况,二分找最早的共鸣点 取max(i-1,max_range(t+1,i-1))

对于第二种情况,我们在3中特判。

from i :i如果往左看,from i 到 i-1 就向右看。

如果要回退,即L则让from i  = t;因为第一个可能不向右看的就是

t+1,i之内的都向右看,倒着赋值即可。

AC 代码

#include<bits/stdc++.h>
using namespace std;
struct node{int id,mx;
};
struct sgt{int a[1000100];int mx[4000100];int id[4000100];void build(int p,int l,int r){if(l == r){mx[p] = a[l];id[p] = l;return;}int mid = (l+r)/2;build(p*2,l,mid);build(p*2+1,mid+1,r);if(mx[p*2]>mx[p*2+1]){mx[p] = mx[p*2];id[p] = id[p*2];}else{mx[p] = mx[p*2+1];id[p] = id[p*2+1];}}void update(int p,int L,int R,int ID,int x){if(L == R){mx[p] = x;return;}int mid = (L+R)/2;if(ID <= mid)update(p*2,L,mid,ID,x);else update(p*2+1,mid+1,R,ID,x);if(mx[p*2]>mx[p*2+1]){mx[p] = mx[p*2];id[p] = id[p*2];}else{mx[p] = mx[p*2+1];id[p] = id[p*2+1];}}node query(int p,int L,int R,int l,int r){if(l > r)return node{0,0};if(l == L&&R == r){return node{id[p],mx[p]};}int mid = (L+R)/2;if(r <= mid){return query(p*2,L,mid,l,r);}else if(l > mid){return query(p*2+1,mid+1,R,l,r);}else{node LL = query(p*2,L,mid,l,mid);node RR = query(p*2+1,mid+1,R,mid+1,r);if(LL.mx > RR.mx){return LL;}else{return RR;}}}int found(int l,int r,int L,int R,int q){if(query(1,L,R,l,r).mx < q)return -1;if(l == r)return l;int mid = (l+r)/2;int Lrange = query(1,L,R,l,mid).mx;int Rrange = query(1,L,R,mid+1,r).mx;if(Lrange < q&& Rrange < q){return -1;}else if(Lrange >= q){return found(l,mid,L,R,q);}else{return found(mid+1,r,L,R,q);}}
}t1,t2;
int t;
int a[300010];
int f[300010];
char res[300010];
int from[300010];
int main(){cin>>t;while(t--){int n;cin>>n;for(int i = 1;i <= n;i++){cin>>a[i];f[i] = 0;t2.a[i] = i + a[i];t1.a[i] = 0;}t1.build(1,1,n);//维护f it2.build(1,1,n);//维护i + a[i]f[0] = f[1] = 0;for(int i = 2;i <= n;i++){if (!a[i]) { f[i] = f[i - 1];from[i] = i; continue; }int t = lower_bound(f, f + i, i - a[i] - 1) - f;//找最早的共鸣点from[i] = t;//Lif (t == i) f[i] = f[i - 1];//else{f[i] = max(i-1, t2.query(1,1,n,t+1,i-1).mx);if (f[i - 1] > f[i]) f[i] = f[i - 1], from[i] = i;//Rif (f[i - 1] >= i && i + a[i] > f[i]) {f[i] = i + a[i];from[i] = i;//R}}}if(f[n] < n){cout<<"NO"<<endl;}else {puts("YES");int cur = n;while (cur) {if (from[cur] == cur) res[cur] = 'R', --cur;else {res[cur] = 'L';fill(res + from[cur] + 1, res + cur, 'R');cur = from[cur];}}res[n + 1] = 0; puts(res + 1);}}
}

 


http://www.ppmy.cn/server/121147.html

相关文章

网页打开时,下载的文件svg+xml类型有什么作用?

‌SVG文件在网页设计中的主要作用包括清晰度、多功能性、较小的文件大小以及可访问性和包容性。‌ ‌清晰度‌&#xff1a;SVG文件可以无限扩展&#xff0c;这意味着您可以根据需要调整其大小而不会失去清晰度。与光栅图像相比&#xff0c;SVG文件在放大时不会出现模糊或颗粒感…

Java集合(Map篇)

一.Map a.使用Map i.键值&#xff08;key-value&#xff09;映射表的数据结构&#xff0c;能高效通过key快速查找value&#xff08;元素&#xff09;。 ii.Map是一个接口&#xff0c;最常用的实现类是HashMap。 iii.重复放入k-v不会有问题&#xff0c;但是一个…

LeetCode 滑动窗口 滑动子数组的美丽值

滑动子数组的美丽值 给你一个长度为 n 的整数数组 nums &#xff0c;请你求出每个长度为 k 的子数组的 美丽值 。 一个子数组的 美丽值 定义为&#xff1a;如果子数组中第 x 小整数 是 负数 &#xff0c;那么美丽值为第 x 小的数&#xff0c;否则美丽值为 0 。 请你返回一个包含…

LeetCode从入门到超凡(二)递归与分治算法

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的LeetCode学习总结文档&#xff1b;在算法设计中&#xff0c;递归和分治算法是两种非常重要的思想和方法。它们不仅在解决复杂问题时表…

vue scoped解析

不加scoped 加上scoped 从上面的图可以看出&#xff0c;给style加上scoped之后&#xff0c;会给这个模块的所有元素都加上一个自定义属性data-v-xxxx&#xff0c;这个xxxx就是这个文件的相对路径加上文件名生成的hash值&#xff0c;这样就能保证自定义属性独一无二 给所有元…

PHP基础语法

引言 PHP&#xff08;Hypertext Preprocessor&#xff09;是一种广泛使用的开源脚本语言&#xff0c;特别适合于Web开发。它是一种服务器端语言&#xff0c;可以嵌入HTML中使用。本文将介绍PHP的基础语法&#xff0c;包括变量、数据类型、控制结构、函数等&#xff0c;为初学者…

几十年高速发展的根本原因

人口红利&#xff0c;资源红利&#xff0c;世贸红利&#xff0c;城市化红利&#xff0c; 财富洼地红利&#xff0c;无数红利和时机赶在一起了&#xff0c;再加上劳动勤奋这些导致高速发展了。很多人在这个过程中发家致富了&#xff0c;大部分是红利主导&#xff0c;并非能力&am…

java-----IDE(集成开发环境)

IDE&#xff08;集成开发环境&#xff09; IDE&#xff08;集成开发环境&#xff09;-IDEA IDEA 介绍 1) IDEA 全称 IntelliJ IDEA2) 在业界被公认为最好的Java开发工具3) IDEA是JetBrains 公司的产品&#xff0c;总部位于捷克的首都布拉格4) 除了支持Java开发&#xff0c;还…