CF1032G Chattering

题意

思路

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

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

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

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

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

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

实现

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

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cctype>
  5. #include<algorithm>
  6. #include<cmath>
  7. using namespace std;
  8. inline int read(){
  9. int w=0,x=0;char c=getchar();
  10. while(!isdigit(c))w|=c=='-',c=getchar();
  11. while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
  12. return w?-x:x;
  13. }
  14. namespace star
  15. {
  16. const int maxn=3e5+10;
  17. int n,a[maxn];
  18. int log[maxn];
  19. int l[20][maxn],r[20][maxn];
  20. struct RMQ{
  21. int st[maxn][20],val[maxn];
  22. int op;
  23. inline int MAX(int x,int y){
  24. return val[x]>val[y]?x:y;
  25. }
  26. inline void build(int *b,int n,int _op){
  27. op=_op;
  28. for(int i=1;i<=n;i++) st[i][0]=i,val[i]=op*b[i];
  29. for(int j=1;j<=log[n];j++)
  30. for(int i=1;i<=n;i++)
  31. st[i][j]=MAX(st[i][j-1],st[i+(1<<(j-1))][j-1]);
  32. }
  33. inline int query(int l,int r){
  34. int k=log[r-l+1];
  35. return MAX(st[l][k],st[r-(1<<k)+1][k]);
  36. }
  37. }L,R;
  38. inline void work(){
  39. n=read();
  40. if(n==1)return (void)puts("0");
  41. for(int i=2;i<=3*n;i++) log[i]=log[i>>1]+1;
  42. for(int i=1;i<=n;i++) a[i]=a[i+n]=a[i+n+n]=read();
  43. for(int i=0;i<=log[3*n];i++) l[i][1]=1,r[i][n*3]=3*n;
  44. 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]);
  45. L.build(l[0],3*n,-1),R.build(r[0],3*n,1);
  46. for(int l1,r1,j=1;j<=log[3*n];j++)
  47. for(int i=1;i<=3*n;i++){
  48. l1=L.query(l[j-1][i],r[j-1][i]);
  49. r1=R.query(l[j-1][i],r[j-1][i]);
  50. l[j][i]=min(l[j-1][l1],l[j-1][r1]);
  51. r[j][i]=max(r[j-1][l1],r[j-1][r1]);
  52. }
  53. for(int i=n+1;i<=n<<1;i++){
  54. int u=i,v=i,ans=0;
  55. for(int j=log[n*3];~j;j--)
  56. if(max(r[j][u],r[j][v])-min(l[j][u],l[j][v])+1<n){
  57. int su=L.query(l[j][u],r[j][v]),sv=R.query(l[j][u],r[j][v]);
  58. u=su,v=sv;
  59. ans+=(1<<j);
  60. }
  61. printf("%d ",ans+1);
  62. }
  63. }
  64. }
  65. signed main(){
  66. star::work();
  67. return 0;
  68. }

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. 工具篇:介绍几个好用的guava工具类

    前言 平时我们都会封装一些处理缓存或其他的小工具.但每个人都封装一次,重复造轮子,有点费时间.有没有一些好的工具库推荐-guava.guava是谷歌基于java封装好的开源库,它的性能.实用性,比我们 ...

  2. DFS————从普及到IOI(暴力骗分小能手)

    DFS 啦啦啦,再来水一波 先说思想吧! 背景: 深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法. ----来自度娘 一.思想 DFS算法思 ...

  3. codeforeces 845B

    题解 codefores 845B 原题 Luba has a ticket consisting of 6 digits. In one move she can choose digit in a ...

  4. Serverless Web Function 实践教程(一):快速部署 Node.js Web 服务

    作为目前广受欢迎的 Web 服务开发语言,Node.js 提供了众多支持 HTTP 场景的相关功能,可以说是为 Web 构建而生.因此,基于 Node.js,也诞生了多种 Web 服务框架,它们对 N ...

  5. expdp数据泵导出数据汇总

    [oracle@enmo1 ~]$ mkdir datadump[oracle@enmo1 ~]$ cd datadump/[oracle@enmo1 datadump]$ pwd/home/orac ...

  6. Unity3D学习笔记1——绘制一个三角形

    目录 1. 绪论 2. 概述 3. 详论 3.1. 准备 3.2. 实现 3.3. 解析 3.3.1. 场景树对象 3.3.2. 绘制方法 4. 结果 1. 绪论 最近想学习一下Unity3d,无奈发 ...

  7. 在vue项目中使用echarts

    1.安装echarts依赖npm install echarts --save 2.在要使用的页面引入import echarts from 'echarts'v5之后使用 import * echa ...

  8. vue+element表格

    效果图 备注:前后端分离实现效果 接下来是代码环节 <template>   <div class="comprehensive-table-container" ...

  9. 五、JavaSE语言基础之流程控制

    流程控制的简单概念 流程控制:指通过关键字控制代码的执行流程; 一.顺序结构:执行顺序从左到右从上到下; 顺序结构无关键字,一般而言大多数代码都是顺序结构; 二.选择结构:根据条件判断是否执行 选择结 ...

  10. Kubernetes中予许及限制(PodSecurityPolicy)使用宿主机资源

    1.在pod中使用宿主机命名空间.端口等资源 pod中的容器通常在分开的Linux命名空间中运行.这些命名空间将容器中的进程与其他容器中,或者宿主机默认命名空间中的进程隔离开来. 例如,每一个pod有 ...