这个题吧当时在考场只得了45分 然后70分的性质都分析到了 不知道为啥就是写萎蛋了

哎 当时还是too young too simple

看了一下julao们的博客这个题有两种做法

一个是比较费脑子的倍增做法

一个是比较费体力【大雾 的主席树做法

打死也不写数据结构的我当然还是学第一个啦

首先我们可以分析到要么往右跳一步再往左跳 要么一直往左跳

这个过程我们可以O(n^2)做 通过更新mn[x]就是每个点往左跳最远的位置 这样就可以一步一步往左跳

然后这个过程可以优化一下就是从右往左扫一遍更新先往右跳的 比较好写233

然后我们可以发现这个mn它是一段一段的 所以我们一步一步跳很浪费时间

可以联想到倍增 也就是把一步一步换成2^i步这样 这样可以lgn换掉一个n

所以我们可以用f[x][i]表示x走2^i步最远的位置

我们再来观察题目性质

它每次询问的是x走到一段区间的距离和 这个问题显然是可以差分的

也就是x->[l,r] = x->[l,x] - x->[r+1,x]

我们还可以观察到这个跳跃正反是一样的 于是我们要做的就是求calc(l,x) - calc(r+1,x)

那么我们可以预处理一个s[x][i]数组表示x~f[x][i]这些点跳到f[x][i]的最少步数和

所以我们calc要做的就是[l,x]这些点跳到x的步数和 也可以反过来做就是x象征性的往左跳 然后实际上统计的都是这些点到x的距离【有点拗口 但好像就是这么理解的

然后跳的话。。。就是统计每次2^j跳的和然后加进来就行了

有些小trick放在代码里了 不影响正常理解应该 只是大大缩短了代码量

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 20021225
#define N 300010
#define LG 20
using namespace std; int s[N][LG],f[N][LG];
int w[N],n,l,r,x,Q;
int gcd(int x,int y){return y?gcd(y,x%y):x;}
ll calc(int l,int r)
{
if(w[r]<=l) return r-l;
ll ans=r-w[r]; r=w[r]; int tot=;
for(int i=LG-;~i;i--) if(f[r][i]>l)
ans+=s[r][i]+tot*(r-f[r][i]),r=f[r][i],tot+=<<i;
return ans+(r-l)*(tot+);
}
int main()
{
scanf("%d",&n); w[]=;
for(int i=;i<=n;i++) scanf("%d",&w[i]);
f[n][]=w[n]; s[n][]=n-w[n];
for(int i=n-;i;i--) f[i][]=min(f[i+][],w[i]),s[i][]=i-f[i][];
for(int i=;i<LG;i++) for(int j=;j<=n;j++) if(f[j][i-])
f[j][i]=f[f[j][i-]][i-],
s[j][i]=s[j][i-]+s[f[j][i-]][i-]+(f[j][i-]-f[j][i])*(1ll<<(i-));
scanf("%d",&Q);
while(Q--)
{
scanf("%d%d%d",&l,&r,&x);
ll tp=calc(l,x)-calc(r+,x),dn=r-l+;
ll g=gcd(tp%dn,dn);
printf("%lld/%lld\n",tp/g,dn/g);
}
return ;
}

最新文章

  1. arcengine中自定义工具和自带工具条(ICommand)点击后和其他工具使用的冲突
  2. C语言中的system函数参数及其作用
  3. Ubuntu 下使用declare的问题
  4. Java面试题总结系列 Servlet
  5. C# 枚举(enum)
  6. HoloLens开发手记 - Unity之Locatable camera 使用相机
  7. 黄聪:C#图片处理封装类(裁剪、缩放、清晰度、加水印、生成缩略图)有示例(转)
  8. Building microservices with Spring Cloud and Netflix OSS, part 2
  9. 【转】【已解决】Android中ActionBar中不显示overflow(就是三个点的那个按钮)--不错
  10. Web模板
  11. Android APN配置
  12. Direct UI
  13. 如何去除ecshop标题和网站底部的Powered by ECShop
  14. 1分钟选好最合适你的JavaScript框架
  15. linux下将eclipse项目转换为gradle项目
  16. 页面优化,谈谈重绘(repaint)和回流(reflow)
  17. 单点登录实现原理(SSO)
  18. 发布python包
  19. 深入理解C语言内存管理
  20. Luogu P1330 封锁阳光大学

热门文章

  1. Python_013(面向对象概念)
  2. 30 August
  3. log4j file 路径
  4. Zsh vs. Bash不完全对比解析,zsh是一种更强大的被成为“终极”的Shell
  5. 007-TreeMap、Map和Bean互转、BeanUtils.copyProperties(A,B)拷贝、URL编码解码、字符串补齐,随机字母数字串
  6. 大数据学习笔记之Zookeeper(四):Zookeeper实战篇(二)
  7. JSP 学习笔记1
  8. 笨方法学Python 错误记录
  9. sourcetree for mac 使用
  10. SAP选择屏幕开发(二)(转)