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. 数据结构-几种Tree

    1.二叉查找树 或 二叉排序树 (BST) 性质:左子树的键值小于根的键值,右子树的键值大于根的键值. 2.平衡二叉树(AVL Tree) 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且 ...

  2. 深入理解java虚拟机笔记Chapter8

    运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法 ...

  3. mybatis入门案例——IDEA版

    环境:IDEA2017,jdk1.8.0,maven3.5.2 步骤: 1.创建一个普通Maven工程,删掉src目录,再创建一个maveb的model命名为mybatis-01 2.配置 pom.x ...

  4. 关于MySql数据库误操作数据找回的办法

    先讲个事,前段时间,系统长时间不用的一个功能被开放出来了,想当然的我没有在测试平台上测试,直接操作了正式系统(的确是我不严谨),导致好多数据异常,页面展示错乱了.于是我想到的第一个就是进行备份还原.项 ...

  5. golang 模板语法使不解析html标签及特殊字符

    场景 有时候需要使用go的模板语法,比如说用go 去渲染html页面的时候,再比如说用go的模板搞代码生成的时候.这时候可能会遇到一个麻烦,不想转译的特殊字符被转译了. 我遇到的情况是写代码生成器的时 ...

  6. unity中的文件存储路径与各平台(Android,iOS)的关系

    原文链接:unity中的文件存储路径与各平台(Android,iOS)的关系 主要是这个问题困扰我了一阵子,所以特写写... unity中的的各种存储方法的对应关系(直接上截图吧) 重点说的是Appl ...

  7. python之tuple元组,基础篇

    元组:它是一个序列,跟列表一样,里面存放多个元素 特点:1.有序的2.每个元素不可以被更改,不可以增加,不可以删除3.元组每个元素可以是任何数据类型1,定义一个非空元组 name_tuple = (& ...

  8. 痞子衡嵌入式:对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同. 本篇是 <在SBL项目实战中妙用i.MXRT1xxx里Syst ...

  9. SpringBoot拦截器及源码分析

    1.拦截器是什么 java里的拦截器(Interceptor)是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止 ...

  10. Docker:docker搭建redis一主多从集群(配置哨兵模式)

    角色 实例IP 实例端口 宿主机IP 宿主机端口 master 172.19.0.2 6382 192.168.1.200 6382 slave01 172.19.0.3 6383 192.168.1 ...