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. mongodb的ObjectId最后三个字节有趣的地方

    ObjectId 由12个字节组成,其中组成如下: a 4-byte timestamp value, representing the ObjectId's creation, measured i ...

  2. 即时性能分析工具 Pyroscope

    当网站上线后,流量增加或短暂功能故障,都会造成使用者体验相当不好,而这时该怎么快速找到性能的瓶颈呢?通常 CPU 达到 100% 时,有时候也很难复制及找出关键问题点. 本篇文章,我们会介绍一套工具叫 ...

  3. Java显式锁

    Java 显式锁. 一.显式锁 什么是显式锁? 由自己手动获取锁,然后手动释放的锁. 有了 synchronized(内置锁) 为什么还要 Lock(显示锁)? 使用 synchronized 关键字 ...

  4. OpenCV随笔

    创建一个窗口#zeros(shape,dtype=float,order='C')#shape:形状,dtype:数据类型,可选参数,默认numpy.float64img = np.zeros((50 ...

  5. 注册中心ZooKeeper,Eureka,Consul,Nacos对比

    简介 ​ 服务注册中心本质上是为了解耦服务提供者和服务消费者.对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的.更进一步,为了支持弹性扩缩容特性,一个微服务的提供者 ...

  6. DOS命令行(6)——Windows网络状态及用户管理

    ipconfig --查看计算机中适配器的TCP/IP配置信息 命令格式: ipconfig [/allcompartments] [/? | /all | /renew [adapter] | /r ...

  7. 性能分析之用户数(线程数)/响应时间/TPS的关系

    最近在写一些东西的时候,把一些内容整理了一下. 在考虑压力工具中的用户数(有些工具中称为线程数,本文后续都用"用户数"来说明).响应时间.TPS三者之间的关系时,想到之前也有人问起 ...

  8. canvas介绍和用途

    canvas介绍和用途 canvas(画布)主要是位图 svg(矢量图) canvas标签,必须要写的3个属性 id width height 为什么不在style中设置width和height呢? ...

  9. ABP Framework V4.4 RC 新增功能介绍

    目录 新增功能概述 启动模板删除 EntityFrameworkCore.DbMigrations 项目 CMS-Kit 动态菜单管理 Razor引擎对文本模板的支持 DbContext/Entiti ...

  10. 44、wget和curl的常用参数

    1.wget: wget是文件下载的工具: 不加任何参数是直接下载该文件: (1)-O: 将下载的文件指定为特定的文件名: wget -O baidu.html www.baidu.com --201 ...