Luogu1081 NOIP2012 开车旅行 倍增
为什么NOIP的题目都这么长qwq
话说2012的D1T3和D2T3都是大火题啊qwq
预处理神题
对于这种跳跳跳的题目考虑使用倍增优化枚举。先预处理某个点之后距离最小和次小的城市,然后倍增预处理一大堆东西。设$f_i$表示从$A$开始开$2^i$次车到达的地点,$g_i$表示从$B$开始开$2^i$次车到达的地点,$k_{i,0/1}$表示从$A$开始开$2^i$次车$A$或$B$经过的路程,$l_{i,0/1}$表示从$B$开始开$2^i$次车$A$或$B$经过的路程。注意边界与越界情况的处理。
接下来就可以直接拼凑法跳了,时间复杂度$O((n+q)logn)$
#include<bits/stdc++.h>
#define MAXN 100001
using namespace std;
inline int read(){
, k = ;
char c = getchar();
while(!isdigit(c) && c != '-') c = getchar();
if(c == '-') k = -k , c = getchar();
) + a + (c ^ ') , c = getchar();
return a * k;
}
][] , lb[MAXN][][];
][] , h[MAXN] , N;
set < pair < int , int > > s;
inline ? a : -a;}
pair < int , int > cul(int ss , int x){
pair < , );
) ; i >= ; i--)
] && (] + lb[ss][i][] <= x){
t.first += la[ss][i][];
t.second += lb[ss][i][];
ss = f[ss][i][];
}
return t;
}
int main(){
memset(la , , , sizeof(lb));
N = read();
; i <= N ; i++) h[i] = read();
s.insert(make_pair(h[N] , N));
s.insert(make_pair(h[N - ] , N - ));
) f[N - ][][] = N;
; i ; i--){
set < pair < int , int > > :: iterator t = s.insert(make_pair(h[i] , i)).first;
if(t == s.begin()){
f[i][][] = (++s.begin())->second;
f[i][][] = (++++s.begin())->second;
continue;
}
set < pair < int , int > > :: iterator t1 = --t , t2 = ++++t;
if(t2 == s.end()){
f[i][][] = t1->second;
f[i][][] = (--t1)->second;
}
else{
if(h[i] - t1->first <= t2->first - h[i]){
f[i][][] = t1->second;
if(t1 == s.begin()){
f[i][][] = t2->second;
continue;
}
--t1;
}
else{
f[i][][] = t2->second;
if(++t2 == s.end()){
f[i][][] = t1->second;
continue;
}
}
][] = t1->second;
][] = t2->second;
}
}
; i <= N ; i++){
][]) la[i][][] = abs(h[i] - h[f[i][][]]);
][]) lb[i][][] = abs(h[i] - h[f[i][][]]);
la[i][][] = lb[i][][] = ;
}
; i < N ; i++){
f[i][][] = f[f[i][][]][][];
f[i][][] = f[f[i][][]][][];
la[i][][] = la[i][][];
lb[i][][] = lb[f[i][][]][][];
la[i][][] = la[f[i][][]][][];
lb[i][][] = lb[i][][];
}
; << i < N ; i++)
; j <= N - ( << i) ; j++){
f[j][i][] = f[f[j][i - ][]][i - ][];
f[j][i][] = f[f[j][i - ][]][i - ][];
la[j][i][] = la[j][i - ][] + la[f[j][i - ][]][i - ][];
lb[j][i][] = lb[j][i - ][] + lb[f[j][i - ][]][i - ][];
la[j][i][] = la[j][i - ][] + la[f[j][i - ][]][i - ][];
lb[j][i][] = lb[j][i - ][] + lb[f[j][i - ][]][i - ][];
}
;
pair < , X0);
; i <= N ; i++){
pair < int , int > t = cul(i , X0);
){
maxN = t;
dir = i;
}
&& t.second == && h[dir] < h[i]){
maxN = t;
dir = i;
}
else if(t.second && ((long long)maxN.first * t.second > (long long)maxN.second * t.first || maxN.first * t.second == maxN.second * t.first && h[dir] < h[i])){
maxN = t;
dir = i;
}
}
printf("%d\n" , dir);
for(X0 = read() ; X0 ; X0--){
int a = read() , b = read();
pair < int , int > t = cul(a , b);
printf("%d %d\n" , t.first , t.second);
}
;
}
Luogu1081 NOIP2012 开车旅行 倍增的更多相关文章
- P1081 [NOIP2012]开车旅行[倍增]
P1081 开车旅行 题面较为啰嗦.大概概括:一个数列,只能从一个点向后走,两种方案:A.走到和自己差的绝对值次小的点B.走到和自己差的绝对值最小点:花费为此差绝对值:若干询问从规定点向后最多花 ...
- luogu1081 [NOIp2012]开车旅行 (STL::multiset+倍增)
先用不管什么方法求出来从每个点出发,A走到哪.B走到哪(我写了一个很沙雕的STL) 然后把每个点拆成两个点,分别表示A从这里出发和B从这里出发,然后连边是要A连到B.B连到A.边长就是这次走的路径长度 ...
- 洛谷1081 (NOIp2012) 开车旅行——倍增预处理
题目:https://www.luogu.org/problemnew/show/P1081 预处理从每个点开始a能走多少.b能走多少.可以像dp一样从后往前推. 但有X的限制.所以该数组可以变成倍增 ...
- Cogs 1264. [NOIP2012] 开车旅行(70分 暴力)
1264. [NOIP2012] 开车旅行 ★★☆ 输入文件:drive.in 输出文件:drive.out 简单对比时间限制:2 s 内存限制:128 MB [题目描述] 小A 和小 ...
- $Noip2012\ Luogu1081$ 开车旅行 倍增优化$ DP$
Luogu Description Sol 1.发现对于每个城市,小A和小B的选择是固定的,可以预处理出来,分别记为ga[],gb[] 2.并且,只要知道了出发城市和出发天数,那么当前城市和小A,小B ...
- 【vijos1780】【NOIP2012】开车旅行 倍增
题目描述 有\(n\)个城市,第\(i\)个城市的海拔为\(h_i\)且这\(n\)个城市的海拔互不相同.编号比较大的城市在东边.两个城市\(i,j\)之间的距离为\(|h_i-h_j|\) 小A和小 ...
- NOIP2012开车旅行 【倍增】
题目 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为Hi,城市 i 和城 ...
- 【NOIP2012提高组】开车旅行 倍增
题目分析 朴素的做法就是预处理下一个目的地,然后跑模拟,超时. 本题最重要的考点是倍增优化.设$fa[i][j]$表示a从i出发行驶$2^j$“次”后行驶的路程,$fb[i][j]$表示从i出发行驶$ ...
- noip2012开车旅行 题解
题目大意: 给出n个排成一行的城市,每个城市有一个不同的海拔.定义两个城市间的距离等于他们的高度差的绝对值,且绝对值相等的时候海拔低的距离近.有两个人轮流开车,从左往右走.A每次都选最近的,B每次都选 ...
随机推荐
- beego+vue.js分离开发,结合发布,简单部署
大家知道,golang开发的东西部署简单是它很大的卖点,一般的应用,生成的可执行文件直接放服务器上运行即可,不需要任何环境.当然,大型的应用才需要比如mysql,nginx等. 但是当vue.js出现 ...
- Jenkins报错'Gradle build daemon disappeared unexpectedly'的问题解决
在将项目集成到 Jenkins 后,经常会出现不稳定的构建,Jenkins 控制台输出的错误信息为:Gradle build daemon disappeared unexpectedly (it m ...
- 对JS作用域和作用域链的理解
理解好javascript的变量作用域和链式调用机制对用好变量起着关键的作用,下面我来谈谈这两个概念的理解. (1)链式调用机制 作用域链的定义:函数在调用参数时会从函数内部到函数外部逐个”搜索“参数 ...
- Fiddler抓包使用教程-基本功能介绍
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72932886 本文出自[赵彦军的博客] Fiddler 基本页面 会话列表功能介绍 ...
- Spring boot 入门篇
详见:https://www.cnblogs.com/ityouknow/p/5662753.html 什么是Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架, ...
- 【锁】Oracle死锁(DeadLock)的分类及其模拟
[锁]Oracle死锁(DeadLock)的分类及其模拟 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不 ...
- etcd raft如何实现Linearizable Read
Linearizable Read通俗来讲,就是读请求需要读到最新的已经commit的数据,不会读到老数据. 对于使用raft协议来保证多副本强一致的系统中,读写请求都可以通过走一次raft协议来满足 ...
- 合理配置SQLSERVER内存
合理配置SQLSERVER内存 原文地址:https://www.cnblogs.com/lyhabc/archive/2012/09/28/2707857.html SQLSERVER是个很喜欢内存 ...
- Dos命令讲解
目录 一.什么是DOS 二.启动DOS的多种方法 三.DOS的内部命令与外部命令 四.系统环境变量讲解 增加Path环境变量路径 常见的系统环境变量 五.常用的运行命令 六.DOS使用技巧 设置CMD ...
- Python基础知识:类
初级篇 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 1.面向对象三大特性 ...