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加固的诞生, ...
随机推荐
- Django(60)Django内置User模型源码分析及自定义User
前言 Django为我们提供了内置的User模型,不需要我们再额外定义用户模型,建立用户体系了.它的完整的路径是在django.contrib.auth.models.User. User模型源码分析 ...
- JVM系列(五):gc实现概要01
java的一大核心特性,即是自动内存回收.这让一些人从繁琐的内存管理中解脱出来,但对大部分人来说,貌似这太理所当然了.因为现在市场上的语言,几乎都已经没有了还需要自己去管理内存这事.大家似乎都以为,语 ...
- 如何在CentOS 7上搭建LAMP环境(使用YUM或编译)
什么是LAMP? LAMP是Linux,Apache,MySQL和PHP的缩写. 它是一堆应用程序的堆栈,它们在Web服务器上一起工作以托管网站. 话虽如此,每个程序都有不同的目的: 在LAMP中, ...
- cisco交换机端口从errdisable状态恢复
故障描述 经用户反馈,一台cisco2960x接入交换机的一个端口插网线不通,ip电话也没有poe供电. 排查过程 查看交换机端口状态,发现变成了errdisable: ZH_HQN_SW2960X_ ...
- Typescript学习总结
typescript(以下简称TS)出来也有好长时间了,下面记录一下学习心得. 首先学这门语言前,请确保有以下基础知识: 扎实的javascript基础知识 es6的基础知识 面向对象编程的概念(没有 ...
- 案例 | 腾讯广告 AMS 的容器化之路
作者 张煜,15年加入腾讯并从事腾讯广告维护工作.20年开始引导腾讯广告技术团队接入公司的TKEx-teg,从业务的日常痛点并结合腾讯云原生特性来完善腾讯广告自有的容器化解决方案 项目背景 腾讯广告承 ...
- 技术实践:教你用Python搭建gRPC服务
摘要:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言. 本文分享自华为云社区& ...
- 『无为则无心』Python序列 — 19、Python列表的其他操作(切片和遍历)
目录 1.通过切片对列表的操作 (1)通过切片对列表进行修改 (2)通过切片对列表进行删除 (3)注意 2.列表的循环遍历 (1)while循环遍历 (2)for循环遍历 3.列表嵌套 4.综合示例 ...
- 关于 C#的一些记录
1, 注意: 使用Linq to Sql 查询数据库的时候,进行where 判断需要注意.我使用的EF,以下为我的记录使用Contain 需要 使用 *.Contains("" + ...
- Redis 底层数据结构之压缩列表
文章参考:<Redis 设计与实现>黄建宏 压缩列表 压缩列表 ziplist 是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比 ...