CF1032G Chattering

题意

思路

对于每一个位置,它转移的范围是确定的。

对于一段可以走到的区间,我们可以求出区间中所有点再能走到区间范围。

于是这个就可以倍增进行转移。

如何快速求出一段区间能走到的区间范围?也就是分别求出一段区间向左跳的位置的最小值和向右跳位置的最大值,发现这其实就是一个RMQ问题。但是因为还有倍增的时间复杂度,而且是没有修改的,那么我们可以利用ST表做到 查询。

于是时间复杂度就变成了 的。

这个转移的思想和ATcoder的一道题比较像。

实现

  • 题目是一个环,所以我们需要将序列延长成三倍,然后在中间段查询。
  • 倍增时,若倍增到的左右端点距离已经超过 说明使完全覆盖,不优。
  • 最后需要将答案加一,因为第一次的时间并未算上。当 为 1 时,不需要传播,答案为 0。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<cmath>
using namespace std;
inline int read(){
int w=0,x=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
return w?-x:x;
}
namespace star
{
const int maxn=3e5+10;
int n,a[maxn];
int log[maxn];
int l[20][maxn],r[20][maxn];
struct RMQ{
int st[maxn][20],val[maxn];
int op;
inline int MAX(int x,int y){
return val[x]>val[y]?x:y;
}
inline void build(int *b,int n,int _op){
op=_op;
for(int i=1;i<=n;i++) st[i][0]=i,val[i]=op*b[i];
for(int j=1;j<=log[n];j++)
for(int i=1;i<=n;i++)
st[i][j]=MAX(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
inline int query(int l,int r){
int k=log[r-l+1];
return MAX(st[l][k],st[r-(1<<k)+1][k]);
}
}L,R;
inline void work(){
n=read();
if(n==1)return (void)puts("0");
for(int i=2;i<=3*n;i++) log[i]=log[i>>1]+1;
for(int i=1;i<=n;i++) a[i]=a[i+n]=a[i+n+n]=read();
for(int i=0;i<=log[3*n];i++) l[i][1]=1,r[i][n*3]=3*n;
for(int i=1;i<=3*n;i++) l[0][i]=max(1,i-a[i]),r[0][i]=min(n*3,i+a[i]);
L.build(l[0],3*n,-1),R.build(r[0],3*n,1);
for(int l1,r1,j=1;j<=log[3*n];j++)
for(int i=1;i<=3*n;i++){
l1=L.query(l[j-1][i],r[j-1][i]);
r1=R.query(l[j-1][i],r[j-1][i]);
l[j][i]=min(l[j-1][l1],l[j-1][r1]);
r[j][i]=max(r[j-1][l1],r[j-1][r1]);
}
for(int i=n+1;i<=n<<1;i++){
int u=i,v=i,ans=0;
for(int j=log[n*3];~j;j--)
if(max(r[j][u],r[j][v])-min(l[j][u],l[j][v])+1<n){
int su=L.query(l[j][u],r[j][v]),sv=R.query(l[j][u],r[j][v]);
u=su,v=sv;
ans+=(1<<j);
}
printf("%d ",ans+1);
}
}
}
signed main(){
star::work();
return 0;
}

CF1032G Chattering的更多相关文章

  1. Java中JIN机制及System.loadLibrary() 的执行过程

    Android平台Native开发与JNI机制详解 http://mysuperbaby.iteye.com/blog/915425 个人认为下面这篇转载的文章写的很清晰很不错. 注意Android平 ...

  2. python瓦登尔湖词频统计

    #瓦登尔湖词频统计: import string path = 'D:/python3/Walden.txt' with open(path,'r',encoding= 'utf-8') as tex ...

  3. A Game of Thrones(15) - Sansa

    Eddard Stark had left before dawn, Septa Mordane informed Sansa as they broke their fast. “The king ...

  4. Python3自然语言(NLTK)——语言大数据

    NLTK 这是一个处理文本的python库,我们知道文字性的知识可是拥有非常庞大的数据量,故而这属于大数据系列. 本文只是浅尝辄止,目前本人并未涉及这块知识,只是偶尔好奇,才写本文. 从NLTK中的b ...

  5. Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3) Solution

    A. Kitchen Utensils Water. #include <bits/stdc++.h> using namespace std; #define N 110 int n, ...

  6. 阅读android源码了解 android 加载so的流程

    参考原文:http://bbs.pediy.com/thread-217656.htm Android安全–linker加载so流程,在.init下断点: http://www.blogfshare. ...

  7. 【C/C++开发】c++ 工具库 (zz)

    下面是收集的一些开发工具包,主要是C/C++方面的,涉及图形.图像.游戏.人工智能等各个方面,感觉是一个比较全的资源.供参考!  原文的出处:http://www.codemonsters.de/ho ...

  8. A Distributional Perspective on Reinforcement Learning

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1707.06887v1 [cs.LG] 21 Jul 2017 In International Conference on ...

  9. 在Android so文件的.init、.init_array上和JNI_OnLoad处下断点

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/54233552 移动端Android安全的发展,催生了各种Android加固的诞生, ...

随机推荐

  1. springcloud-config配置异常Cannot clone or checkout repository 和 Authentication is required but no CredentialsProvider has been registered解决过程

    Cannot clone or checkout repository, 出现这个异常,通过检查是因为自己本地没有配置 ssh,所以配置了, https://blog.csdn.net/zy_2818 ...

  2. 采用MVC模式创建一个简单的javascript App

    初次翻译,翻译的不好,还请见谅 JavaScript中最好的一部分之一,也可能是最糟糕的. 在HTML文档的头部添加一个开始和结束脚本标记,并在其中引入一些意大利面条式的代码,毫无疑问这是一种过分简单 ...

  3. 深入理解java虚拟机笔记Chapter3-内存分配策略

    内存分配策略 新生代和老年代的 GC 操作 新生代 GC 操作:Minor GC 发生的非常频繁,速度较块. 老年代 GC 操作:Full GC / Major GC 经常伴随着至少一次的 Minor ...

  4. C语言指针间接引用

    int a = 10; //普通变量 int *p = &a; //一级指针.是变量的地址. int **pp = &p; //二级指针.是一级指针的地址. int ***ppp = ...

  5. WordPress安装篇(4):YUM方式安装LNMP并部署WordPress

    YUM方式安装软件的优点就是简单.方便.快捷,本文介绍在Linux上如何使用YUM方式快速安装LNMP并部署WordPress.使用Linux CentOS 7.9 + Nginx 1.18 + My ...

  6. 【NX二次开发】Block UI 多行字符串

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  7. 【NX二次开发】Block UI 通过浏览选择文件夹

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  8. sentinel (史上最全+入门教程)

    文章很长,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈 为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 < Java 高并发 三部曲 > 面试必备 + 大厂 ...

  9. Spring Boot WebFlux-04——WebFlux 整合 Thymeleaf

    第04课:WebFlux 整合 Thymeleaf 上一篇介绍的是用 MongoDB 来实现 WebFlux 对数据源的操作,那么有了数据需要渲染到前台给用户展示,这就是本文关心的 View 层,Vi ...

  10. 使用Spring Data JPA 访问 Mysql 数据库-配置项

    jpa操作数据库 注意:数据库采用的是本机数据库,下面是建表语句及初始化数据: SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------- ...