CF1032G Chattering
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的更多相关文章
- Java中JIN机制及System.loadLibrary() 的执行过程
Android平台Native开发与JNI机制详解 http://mysuperbaby.iteye.com/blog/915425 个人认为下面这篇转载的文章写的很清晰很不错. 注意Android平 ...
- python瓦登尔湖词频统计
#瓦登尔湖词频统计: import string path = 'D:/python3/Walden.txt' with open(path,'r',encoding= 'utf-8') as tex ...
- A Game of Thrones(15) - Sansa
Eddard Stark had left before dawn, Septa Mordane informed Sansa as they broke their fast. “The king ...
- Python3自然语言(NLTK)——语言大数据
NLTK 这是一个处理文本的python库,我们知道文字性的知识可是拥有非常庞大的数据量,故而这属于大数据系列. 本文只是浅尝辄止,目前本人并未涉及这块知识,只是偶尔好奇,才写本文. 从NLTK中的b ...
- 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, ...
- 阅读android源码了解 android 加载so的流程
参考原文:http://bbs.pediy.com/thread-217656.htm Android安全–linker加载so流程,在.init下断点: http://www.blogfshare. ...
- 【C/C++开发】c++ 工具库 (zz)
下面是收集的一些开发工具包,主要是C/C++方面的,涉及图形.图像.游戏.人工智能等各个方面,感觉是一个比较全的资源.供参考! 原文的出处:http://www.codemonsters.de/ho ...
- A Distributional Perspective on Reinforcement Learning
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1707.06887v1 [cs.LG] 21 Jul 2017 In International Conference on ...
- 在Android so文件的.init、.init_array上和JNI_OnLoad处下断点
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/54233552 移动端Android安全的发展,催生了各种Android加固的诞生, ...
随机推荐
- perror()函数的使用
perror()函数的功能是打印一个系统错误信息. perror()函数在Linux系统中属于库函数,在头文件中有如下定义: #include <stdio.h> ...
- C#中使用ffmpeg合并视频
首先将最新的ffmpeg.exe放到debug路径下,下载地址 http://www.ffmpeg.org/download.html 然后调用此方法 public void CombineMp4Wi ...
- git命令使用(必备系列)
git是一个分布式版本控制系统,得益于高效.协作和快速的项目代码管理特性几乎每一个软件开发团队都在深度使用.本篇是对git命令的介绍,涵盖了不低于95%的日常操作命令,对你有用话可以收藏一下哦. 一. ...
- Binding(三):资源和ValueConverter
这节讲资源和值转换器(ValueConverter). 资源 在XAML中,我们想要使用外部的数据或者类,需要引入其命名空间,然后将其定义为XAML页面的资源,供给控件使用,或者我们需要封装一个共用的 ...
- Unity不规则按钮点击区域(UGUI)
文章目录 一. 前言 二. 最终效果 三. 实现 1.创建UICamera 2. UIPolygon节点 3. 编辑碰撞区域 5. 运行测试 6. UIPolygon代码 一. 前言 游戏开发中,可能 ...
- Redis配置统计字典
本章将对Redis的系统状态信息(info命令结果)和Redis的所有配置(包括Standalone.Sentinel.Cluster三种模式)做一个全面的梳理,希望本章能够成为Redis配置统计字典 ...
- 关于使用Draw.io画数据库E-R图的说明
背景简介 E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. diagrams.net是用于构建图表 ...
- 聊一聊我在 B 站自学 Java 的经历吧
Hey guys ,这里是 cxuan,欢迎你收看我最新一期的文章. 这是一篇鸽了很久的文章...... 事情还要从上回说起...... 我爱 B 站! 这篇文章我汇总了 B 站上计算机基础(操作系统 ...
- centos 关闭SELINUX并重启系统
关闭SELINUX [root@bogon ~]# vim /etc/sysconfig/selinux ... SELINUX=disabled ... 执行过程: 重启系统 [root@bogo ...
- MySQL 删除devices表中id最大的一行
原想法:delete from devices where id in (select max(id) from devices); 报错:ERROR 1093 (HY000): You can't ...