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每次都选 ...
随机推荐
- Tensorflow高效读取数据
关于Tensorflow读取数据,官网给出了三种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据. 从文件读取数据: 在TensorFlow ...
- SQLite 知识摘要 --- 事务
在许多时候,我们在使用大数据的时候会发现,尽管sqlite数据库的执行效率已经很快了,但是还是满足不了我们的需求,这时候我们会很容易考虑到使用并发的方式去访问sqlite数据库,但是sqlite数据独 ...
- loadrunner 脚本开发-调用java jar文件远程操作Oracle数据库测试
调用java jar文件远程操作Oracle数据库测试 by:授客 QQ:1033553122 测试环境 数据库:linux 下Oracle_11g_R2 Loadrunner:11 备注:想学ora ...
- 记一次nginx php配置的心路历程
1.本来搞好了php的配置,想把目录下移一层 从 www.abc.com 变成 www.abc.com/wxapi ,由于我的真实文件目录比路由少了一层public 尝试了很多办法都不行 甚至想到了u ...
- MailKit帮助类
public class EmailHelp { /// <summary> /// Smtp服务器地址 /// </summary> private static reado ...
- 搭建iSCSI文件服务器故障转移群集
故障转移群集(Failover Cluster)可以提供一个高可用性应用程序或服务的网络环境,本章将接受如何搭建iSCSI SAN文件服务器故障转移群集. 故障转移群集概述 我们可以将多台服务器组成一 ...
- 辽宁移动宽带体验及魔百盒M101s-2刷机
一.背景 坐标:辽宁 某城,移动宽带100M. 设备:移动赠送,华为光猫一只,魔百盒M101s-2电视盒子 一只,据安装人员说这个魔百盒是移动自己开发设计的. 二.上网体验 上网:浏览一般网站没问题. ...
- [Hive_add_2] Hive 数据类型
Hive 数据类型 正常数据类型 # 整型,4个字节 int # 大整型,8个字节 bigint # 字符串,最大长度2G String 复杂数据类型 # 数组,相同类型元素的数组 array< ...
- 使用sstream来进行类型转换
在某种情况下,我们不得不进行整型等数据类型与字符串类型的转换,比如,将“1234”转换为整数,常规的我们可以使用atoi函数来进行转换,或者是写一个循环来做转换,我们在这里也可以使用sstream类来 ...
- (转)Spring boot(一):入门篇
https://www.cnblogs.com/ityouknow/p/5662753.html#!comments 构建微服务:Spring boot 入门篇 什么是Spring Boot Spri ...