【LOJ】#6435. 「PKUSC2018」星际穿越
题解
想出70的大众分之后就弃疗了,正解有点神仙
就是首先有个比较显然的结论,就是要么是一直往左走,要么是走一步右边,然后一直往左走
根据这个可以结合RMQ写个70分的暴力
我们就考虑,最优的话显然是走一步左边就到了目标点,第二步才开始有分叉
假如我们先走了一步左边,然后就变成了,从\(L[x]\)开始走,下一步可以走到\([L[x],N]\)的所有点最小的转移点之前,之后再把后来走的点代价都加上1即可
这样的话,不管是一直走左边,还是走了一步右边再走了左边,情况都被包含了
这个时候考虑这个问题就比较简单了,可以使用倍增
\(f[i][j]\)表示\([i,n]\)内最小的\(l[x]\)的值
\(s[i][j]\)表示\(i\)走到\(f[i][j]\)内所有点的距离和
转移就是
\(f[i][j] = f[f[i][j - 1]][j - 1]\)
\(s[i][j] = s[i][j - 1] + s[f[i][j - 1]][j - 1] + 2^{j - 1} * (f[i][j - 1] - f[i][j])\)
查询两端前缀和,查的时候直接把\(x\)变成\(L[x]\)进行倍增即可
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 300005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N,L[MAXN];
int f[MAXN][20];
int64 s[MAXN][20];
void Init() {
read(N);
for(int i = 2 ; i <= N ; ++i) read(L[i]);
f[N][0] = L[N];s[N][0] = N - L[N];
for(int i = N - 1 ; i >= 1 ; --i) {
f[i][0] = min(f[i + 1][0],L[i]);s[i][0] = i - f[i][0];
}
for(int j = 1 ; j <= 19 ; ++j) {
for(int i = 1 ; i <= N ; ++i) {
f[i][j] = f[f[i][j - 1]][j - 1];
s[i][j] = s[i][j - 1] + s[f[i][j - 1]][j - 1] + 1LL * (f[i][j - 1] - f[i][j]) * (1 << j - 1);
}
}
}
int64 gcd(int64 a,int64 b) {
return b == 0 ? a : gcd(b,a % b);
}
int64 Calc(int tar,int st) {
if(tar >= L[st]) return st - tar;
int64 res = st - L[st];st = L[st];
int64 sum = 1;
for(int j = 19 ; j >= 0 ; --j) {
if(f[st][j] >= tar) {
res += s[st][j];
res += 1LL * sum * (st - f[st][j]);
st = f[st][j];
sum += 1 << j;
}
}
res += 1LL * (sum + 1) * (st - tar);
return res;
}
void Solve() {
int Q;int l,r,x;
read(Q);
while(Q--) {
read(l);read(r);read(x);
int64 u = Calc(l,x) - Calc(r + 1,x),d = r - l + 1,g = gcd(u,d);
u /= g;d /= g;
out(u);putchar('/');out(d);enter;
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
}
【LOJ】#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」星际穿越(倍增)
题面 传送门 题解 我们先想想,在这个很特殊的图里该怎么走最短路 先设几个量,\(a_i\)表示\([a_i,i-1]\)之间的点都和\(i\)有边(即题中的\(l_i\)),\(l\)表示当前在计算 ...
- #6435. 「PKUSC2018」星际穿越
考场上写出了70分,现在填个坑 比较好写的70分是这样的:(我考场上写的贼复杂) 设\(L(i)=\min_{j=i}^nl(j)\) 那么从i开始向左走第一步能到达的就是\([l(i),i-1]\) ...
- 「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」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...
随机推荐
- poj3667 Hotel (线段树 区间合并)
poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...
- 【题解】 [SCOI2010]连续攻击游戏 (二分图匹配)
原题目戳我 Solution: 方法很巧妙,我们把每个装备的属性 与 装备编号连起来 从1-10000跑二分图,如果出现断层,就退出,输出答案就好. memset清理bool快一点,int洛谷上超时了 ...
- 【枚举Day1】20170529-2枚举算法专题练习 题解
题目: http://www.cnblogs.com/ljc20020730/p/6918328.html 评测器:cena 评测记录: 1.OneMoreRectangle 一个矩形 ●如果任意枚举 ...
- 【bzoj2669】 cqoi2012—局部极小值
http://www.lydsy.com/JudgeOnline/problem.php?id=2669 (题目链接) 题意 给出一个$n*m$的整数矩阵,其中$[1,nm]$中的整数每个出现一次,有 ...
- 在Linux中将脚本做成系统服务
有一些情况下,我们需要将某些脚本作为系统服务来运行.比如,在我使用workerman框架开发php程序时,需要使用管理员权限来运行,而且需要开机自行启动程序提供服务.这个时候将启动程序写成服务就可以很 ...
- react入门-refs
vue有ref来获取template里面的子组件/子元素,react当然也有: <!DOCTYPE html> <html lang="en"> <h ...
- Python 发射导弹的正确方式
——此文以纪念南京大屠杀79周年 今天Toby教你如何用python的basemap包绘制轰炸东京的地图. 在数据可视化过程中,我们常常需要将数据根据其采集的地理位置在地图上显示出来.比如说我们会想要 ...
- Linux问题集锦
一些会遇到的问题,我会不断更新问题集锦~ 1.vi / vim保存文件时遇到的问题:E212: Can't open file for writing 在vi / vim下输入w或wq!保存编辑的文 ...
- log4j2常见配置
依赖jar: <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId> ...
- bzoj千题计划261:bzoj3294: [Cqoi2011]放棋子
http://www.lydsy.com/JudgeOnline/problem.php?id=3294 如果一个颜色的棋子放在了第i行第j列,那这种颜色就会占据第i行第j列,其他颜色不能往这儿放 设 ...