考场上写出了70分,现在填个坑

比较好写的70分是这样的:(我考场上写的贼复杂)

设\(L(i)=\min_{j=i}^nl(j)\)

那么从i开始向左走第一步能到达的就是\([l(i),i-1]\)(显然)

第二步能到达的是\([L(l(i)),l(i)-1]\)

为什么呢,因为i一开始可以直接向左,也可以先向右走到\(l\)最小的位置然后向左,这时能跳到的区间就是\([L(i),i]\)

如果\(L(l(i))=L(i)\)显然这是一种方案,但是有可能\(L(l(i))<L(i)\),既然小了肯定是\(l(k)(k\in[l(i),i))\)这一部分\(<L(i)\),那么当然也是可行的

后面就是\([L(L(\cdots L(l(i))\cdots)),上一个的左端点]\)了,一直推下去。

#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int l[300010],L[300010];
ll D[5010][5010];
//D[i][j]表示从i开始到[j,i-1]的跳的次数之和
int main(){
int n=gi();
for(int i=2;i<=n;++i)l[i]=gi();
L[n]=l[n];for(int i=n-1;i>1;--i)L[i]=std::min(l[i],L[i+1]);
for(int i=2;i<=n;++i){
int x=l[i],lst=i;
for(int j=x;j<lst;++j)D[i][j]=1;
int d=1;
while(x!=1){
lst=x;x=L[x];++d;
for(int j=x;j<lst;++j)D[i][j]=d;
}
for(int j=1;j<i;++j)D[i][j]+=D[i][j-1];
}
int q=gi(),l,r,x;
while(q--){
l=gi(),r=gi(),x=gi();
ll A=D[x][r]-D[x][l-1],B=r-l+1,g=std::__gcd(A,B);
printf("%lld/%lld\n",A/g,B/g);
}
return 0;
}

优化很显然是倍增,很容易想到\(f[i][j]\)设为\(i\)位置向前跳\(L(i)\)跳\(2^j\)次。

再来一个\(g[i][j]\)设为\(i\)位置向前跳\(2^j\)次,这中间每个位置跳的次数的和。随便理解一下就行了。



#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int l[300010],L[300010];
int f[19][300010];
ll g[19][300010];
il ll solve(int x,int y){
if(l[x]<=y)return x-y;
ll ret=x-l[x];int i,j;
x=l[x];
for(i=18,j=1;~i;--i)
if(f[i][x]>=y){
ret+=g[i][x]+j*(x-f[i][x]);
j+=1<<i;
x=f[i][x];
}
return ret+(x-y)*(j+1);
}
int main(){
int n=gi();
for(int i=2;i<=n;++i)l[i]=gi();
L[n]=l[n];for(int i=n-1;i>1;--i)L[i]=std::min(l[i],L[i+1]);
for(int i=1;i<=n;++i)f[0][i]=L[i],g[0][i]=i-L[i];
for(int i=1;i<19;++i)
for(int j=1;j<=n;++j){
f[i][j]=f[i-1][f[i-1][j]];
g[i][j]=g[i-1][j]+g[i-1][f[i-1][j]]+(1<<i-1)*(f[i-1][j]-f[i][j]);
}
int q=gi(),l,r,x;
while(q--){
l=gi(),r=gi(),x=gi();
ll A=solve(x,l)-solve(x,r+1),B=r-l+1,g=std::__gcd(A,B);
printf("%lld/%lld\n",A/g,B/g);
}
return 0;
}

#6435. 「PKUSC2018」星际穿越的更多相关文章

  1. LOJ #6435. 「PKUSC2018」星际穿越(倍增)

    题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...

  2. LOJ 6435 「PKUSC2018」星际穿越——DP+倍增 / 思路+主席树

    题目:https://loj.ac/problem/6435 题解:https://www.cnblogs.com/HocRiser/p/9166459.html 自己要怎样才能想到怎么做呢…… dp ...

  3. 【LOJ】#6435. 「PKUSC2018」星际穿越

    题解 想出70的大众分之后就弃疗了,正解有点神仙 就是首先有个比较显然的结论,就是要么是一直往左走,要么是走一步右边,然后一直往左走 根据这个可以结合RMQ写个70分的暴力 我们就考虑,最优的话显然是 ...

  4. loj#6435. 「PKUSC2018」星际穿越(倍增)

    题面 传送门 题解 我们先想想,在这个很特殊的图里该怎么走最短路 先设几个量,\(a_i\)表示\([a_i,i-1]\)之间的点都和\(i\)有边(即题中的\(l_i\)),\(l\)表示当前在计算 ...

  5. 「PKUSC2018」星际穿越 (70分做法)

    5371: [Pkusc2018]星际穿越 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 27  Solved: 11[Submit][Status] ...

  6. 「PKUSC2018」星际穿越(倍增)

    倍增好题啊! 我们我们预处理 \(f[x][i]\) 表示 \(x\) 点最左到达的端点,\(sum[x][i]\) 表示 \(x\) 点最左到达的端点时 \(f[x][i]\sim x\) 的答案, ...

  7. 「PKUSC2018」星际穿越

    传送门 Solution  倍增 Code  #include <bits/stdc++.h> #define reg register #define ll long long usin ...

  8. LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)

    题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...

  9. LOJ #6432. 「PKUSC2018」真实排名(组合数)

    题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...

随机推荐

  1. MySQL Flashback 工具介绍

    MySQL Flashback 工具介绍 DML Flashback 独立工具,通过伪装成slave拉取binlog来进行处理 MyFlash 「大众点点评」 binlog2sql 「大众点评(上海) ...

  2. [翻译] SIAlertView

    SIAlertView https://github.com/Sumi-Interactive/SIAlertView An UIAlertView replacement with block sy ...

  3. UIWebView如何加载本地图片

    UIWebView如何加载本地图片 UIWebView加载本地图片是有实用价值的.比方说,有时候我们需要本地加载静态页来显示相关帮助信息,而这些帮助信息当中含有很多很多的富文本,用代码实现难度较大,这 ...

  4. 利用jTessBoxEditor工具进行Tesseract3.02.02样本训练,提高验证码识别率

    1.背景 前文已经简要介绍tesseract ocr引擎的安装及基本使用,其中提到使用-l eng参数来限定语言库,可以提高识别准确率及识别效率. 本文将针对某个网站的验证码进行样本训练,形成自己的语 ...

  5. Gogs集成AD域LDAP

    操作步骤: 添加认证源 使用管理员账号登录Gogs,进入控制面板→认证源管理→添加新的源 设置如图所示 使用ldap认证源登录 配置成功后,登录时可选择认真源,界面如图所示

  6. 关于Matlab里面的四个取整(舍入)函数:Floor, Ceil, Fix, Round的解释(转)

    转自http://blog.sina.com.cn/s/blog_48ebd4fb010009c2.html   floor:朝负无穷方向舍入 B = floor(A) rounds the elem ...

  7. Hadoop HBase概念学习系列之数据模型(七)

    HBase是一个类似BigTable的分布式数据库, 它是一个稀疏的长期存储的(存在硬盘上).多维度的.排序的映射表.这张表(HBase)的索引是行关键字.列关键字和时间戳.    HBase中的数据 ...

  8. JdkDynamicAopProxy-笔记

    这个接口的继承体系图: 一.AopProxy InvocationHandler就不说了,看看AopProxy的源码. /** * Delegate interface for a configure ...

  9. 递归计算一个目录的大小【os.wallk()】

    os.walk(): os.walk()可以得到一个三元tupple(dirpath, dirnames, filenames),其中第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的 ...

  10. Spring源码分析(二十)准备环境

    摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. prepareRefresh函数主要是做些准备工作,例如对系统属性及环 ...