#6435. 「PKUSC2018」星际穿越
考场上写出了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」星际穿越的更多相关文章
- LOJ #6435. 「PKUSC2018」星际穿越(倍增)
题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...
- LOJ 6435 「PKUSC2018」星际穿越——DP+倍增 / 思路+主席树
题目:https://loj.ac/problem/6435 题解:https://www.cnblogs.com/HocRiser/p/9166459.html 自己要怎样才能想到怎么做呢…… dp ...
- 【LOJ】#6435. 「PKUSC2018」星际穿越
题解 想出70的大众分之后就弃疗了,正解有点神仙 就是首先有个比较显然的结论,就是要么是一直往左走,要么是走一步右边,然后一直往左走 根据这个可以结合RMQ写个70分的暴力 我们就考虑,最优的话显然是 ...
- loj#6435. 「PKUSC2018」星际穿越(倍增)
题面 传送门 题解 我们先想想,在这个很特殊的图里该怎么走最短路 先设几个量,\(a_i\)表示\([a_i,i-1]\)之间的点都和\(i\)有边(即题中的\(l_i\)),\(l\)表示当前在计算 ...
- 「PKUSC2018」星际穿越 (70分做法)
5371: [Pkusc2018]星际穿越 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 27 Solved: 11[Submit][Status] ...
- 「PKUSC2018」星际穿越(倍增)
倍增好题啊! 我们我们预处理 \(f[x][i]\) 表示 \(x\) 点最左到达的端点,\(sum[x][i]\) 表示 \(x\) 点最左到达的端点时 \(f[x][i]\sim x\) 的答案, ...
- 「PKUSC2018」星际穿越
传送门 Solution 倍增 Code #include <bits/stdc++.h> #define reg register #define ll long long usin ...
- LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)
题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...
- LOJ #6432. 「PKUSC2018」真实排名(组合数)
题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...
随机推荐
- 可以简易设置文字内边距的EdgeInsetsLabel
可以简易设置文字内边距的EdgeInsetsLabel 最终效果: 源码: EdgeInsetsLabel.h 与 EdgeInsetsLabel.m // // EdgeInsetsLabel.h ...
- 获取系统屏幕尺寸参数的类WxHxD
获取系统屏幕尺寸参数的类WxHxD 源码: // // WxHxD.h // PM2.5 // // Created by YouXianMing on 14/10/29. // Copyright ...
- SecureCRT ssh连接linux操作系统(解决Ubutu密钥交换失败的问题)
我们可以使用终端软件SecureCRT 去连接linux操作系统(该SecureCRT服务走端口22,协议是ssh(类似apache走http协议,端口80)),SSH 为 Secure Shell ...
- 解决 锁定文件失败 打不开磁盘“D:\ubuntu\Ubuntu 64 位.vmdk”或它所依赖的某个快照磁盘。 模块 Disk”启动失败
一次在使用虚拟机的过程中,电脑出问题强制关机后,重新打开虚拟机,出现了“文件锁定失败”,打不开虚拟机的情况. 上网百度查相关的解决方案,终于解决了问题.因为虚拟机运行的时候会创建相应的文件,即在虚拟机 ...
- 企业级NFS网络文件共享服务_【all】
1.1. 什么是NFS(1台机器提供服务) Network File System(网络文件系统)通过局域网让不同的主机系统之间共享文件或目录. NFS客户端可以通过挂载的方式将NFS服务器端共享的数 ...
- Linux ifconfig命令详解
ifconfig(interfaces config).通常需要以root身份登录或使用sudo来使用ifconfig工具 ifconfig 命令用来查看和配置网络设备.当网络环境发生改变时可通过此命 ...
- virtualbox 错误解决记录
1,E_INVALIDARG (0x80070057),virtualbox中Cannot register the hard disk错误解决办法 virtualbox中加载已有的虚拟硬盘时出现Ca ...
- spring中MessageSource的配置使用方法3--ResourceBundleMessageSource【转】
本文转载仅供自己学习收录,不做任何商业用途,如有需要请访问原地址:http://blog.csdn.net/qyf_5445/article/details/8124431 ApplicationCo ...
- Python 装饰器---装饰类的两种方法
这是在类的静态方法上进行装饰,当然跟普通装饰函数的装饰器区别倒是不大 def catch_exception(origin_func): def wrapper(self, *args, **kwar ...
- 多线程之CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...