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

embedded/2024/9/25 21:09:56/

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/embedded/116830.html

相关文章

【第2章 开始学习C++】进入C++

文章目录 导语C语言输入和输出main( )函数作为接口的函数头C预处理器和iostream文件头文件名名称空间使用 cout 进行 C 输出控制符 endl 导语 首先介绍一个显示消息的简单C程序。 源代码中包含一些供读者阅读的注释&#xff0c; 这些注释都以 // 打头&#xff0c; 编译器将忽…

51单片机-系列-数码管中断和定时器

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 数码管 8051单片机的最小系统 电源&#xff08;5V&#xff09;复位电路晶振&#xff08;单片机的心脏&#xff09;如果要使用PO口&#xff0c;必须加4.7K-10K上拉电阻&#xf…

linux命令行快捷键

第一章 linux之帮助命令 第二章 linux命令行快捷键 文章目录 linux命令行快捷键 linux命令行快捷键 Tab 命令补全或文件补全Ctrlu 删除或剪切光标之前的命令Ctrla 将光标移动到命令行开头Ctrle 将光标移动到命令行结尾ctrlc 终止当前命令ctrll 清屏ctrly 粘贴ctrlu的内容 参考…

众数信科 AI智能体政务服务解决方案——AI法律助手

政务服务解决方案 AI法律助手 一款基于AI大模型的智能鼠标 搭裁“寻知AI法律助手” 众数信科AI智能体 产品亮点 能够结合全国各地案例数据 为用户提供法律咨询、文书生成、案例研判 类案推荐、法规检索等法律服务 同时结合Al office插件 具备AI智能办公、PPT生成等功能 …

gnome Files管理文件学习

Files文件夹页可以非常高效的使用&#xff0c;接下来介绍一些有用的快捷命令和tricks 首先是快捷键&#xff1a; **Ctrl T**Ctrl N**Ctrl WClose window or tab**Ctrl FSearch**Ctrl LEnter location**BackspaceGo Back to a Previous FolderCtrl Zoom inCtrl -Zoom outCtrl 0…

echarts图表刷新

图表制作完成&#xff0c;点击刷新图标&#xff0c;可以刷新。 <div class"full"><div id"funnel" class"normal"></div><div class"refreshs"><div class"titles_pic"><img src"./…

QT 带箭头的控件QPolygon

由于对当前项目需要绘制一个箭头控件&#xff0c;所以使用了QPainter和QPolygon来进行绘制&#xff0c;原理就是计算填充&#xff0c;下面贴出代码和效果图 这里简单介绍下QPolygon QPolygon是继承自 QVector<QPoint>那么可以很简单的理解为&#xff0c;他就是一个点的…

Vue3 Day7-全局组件、指令以及pinia

7.1 全局组件 App.vue <template><div><h2>我是父组件&#xff0c;下面是全局组件的内容</h2><HelloWorld></HelloWorld></div> </template> ​ <script setup> ​ </script> <style scoped></style&g…