vijos 1780 开车旅行
细节巨多。
倍增即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
#include<cstdlib>
#define maxv 200500
#define maxn 100500
#define eps 1e-7
#define inf 0x7f7f7f7f7f7f7f7fLL
using namespace std;
long long n,m,h[maxn],x,y,aft[maxn][],anc[maxv][],dis1[maxv][],dis2[maxv][],hashed[maxn],pos[maxn];
long long ret1=,ret2=,ans;
struct pnt
{
long long ret,dot,rets;
}p[];
set <long long> s;
set <long long> ::iterator it;
double ans1=inf;
bool cmp(pnt x,pnt y)
{
if (x.ret!=y.ret) return x.ret<y.ret;
return x.rets>y.rets;
}
void divide()
{
for (long long i=;i<=n;i++) hashed[i]=h[i];
sort(hashed+,hashed+n+);
for (long long i=;i<=n;i++)
{
h[i]=lower_bound(hashed+,hashed+n+,h[i])-hashed;
pos[h[i]]=i;
}
}
long long ask(long long x,long long y)
{
ret1=;ret2=;
for (long long e=;e>=;e--)
{
if ((ret1+ret2+dis1[x][e]+dis2[x][e]<=y) && (anc[x][e]))
{
ret1+=dis1[x][e];ret2+=dis2[x][e];
x=anc[x][e];
}
}
}
void update(long long x)
{
if (!ret1) return;
if ((double)ret2/ret1<ans1) {ans1=(double)ret2/ret1;ans=x;}
else if (((double)ret2/ret1-ans1<=eps) && (hashed[h[ans]]<hashed[h[x]])) ans=x;
}
int main()
{
scanf("%lld",&n);
for (long long i=;i<=n;i++) scanf("%lld",&h[i]);
divide();
for (long long i=n;i>=;i--)
{
for (long long j=;j<=;j++) p[j].dot=p[j].ret=inf;
it=s.lower_bound(h[i]);
if (it!=s.end())
{
p[].ret=hashed[h[pos[*it]]];p[].dot=pos[*it];
if (++it!=s.end()) {p[].ret=hashed[h[pos[*it]]];p[].dot=pos[*it];}
it--;
}
if (it!=s.begin())
{
it--;
p[].ret=hashed[h[pos[*it]]];p[].dot=pos[*it];
if (it!=s.begin()) {it--;p[].ret=hashed[h[pos[*it]]];p[].dot=pos[*it];it++;}
}
for (int j=;j<=;j++)
{
if (p[j].ret!=inf)
{
p[j].rets=hashed[h[i]]-p[j].ret;
p[j].ret=abs(hashed[h[i]]-p[j].ret);
}
}
sort(p+,p+,cmp);
if (p[].ret!=inf) aft[i][]=p[].dot;
if (p[].ret!=inf) aft[i][]=p[].dot;
s.insert(h[i]);
}
for (long long i=;i<=n;i++)
{
anc[*i-][]=*aft[i][];dis1[*i-][]=abs(hashed[h[aft[i][]]]-hashed[h[i]]);dis2[*i-][]=;
anc[*i][]=max(*aft[i][]-,(long long));dis1[*i][]=;dis2[*i][]=abs(hashed[h[aft[i][]]]-hashed[h[i]]);
}
n*=;
for (long long e=;e<=;e++)
for (long long i=;i<=n;i++)
{
anc[i][e]=anc[anc[i][e-]][e-];
dis1[i][e]=dis1[i][e-]+dis1[anc[i][e-]][e-];
dis2[i][e]=dis2[i][e-]+dis2[anc[i][e-]][e-];
}
scanf("%lld",&x);
for (long long i=;i<=n;i+=)
{ask(i,x);update(i/);}
printf("%d\n",ans);
scanf("%lld",&m);
for (long long i=;i<=m;i++)
{
scanf("%lld%lld",&x,&y);
ask(*x,y);
printf("%lld %lld\n",ret2,ret1);
}
return ;
}
vijos 1780 开车旅行的更多相关文章
- [NOIP2012提高组]开车旅行
题目:洛谷P1081.Vijos P1780.codevs1199. 题目大意:有n座海拔高度不相同的城市(编号1~n),两城市的距离就是两城市海拔之差.规定每次只能从编号小的城市走到编号大的城市. ...
- Luogu 1081 【NOIP2012】开车旅行 (链表,倍增)
Luogu 1081 [NOIP2012]开车旅行 (链表,倍增) Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已 ...
- CH5701 开车旅行
题意 5701 开车旅行 0x50「动态规划」例题 描述 小A和小B决定利用假期外出旅行,他们将想去的城市从1到N编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 ...
- 2012Noip提高组Day1 T3 开车旅行
题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...
- Cogs 1264. [NOIP2012] 开车旅行(70分 暴力)
1264. [NOIP2012] 开车旅行 ★★☆ 输入文件:drive.in 输出文件:drive.out 简单对比时间限制:2 s 内存限制:128 MB [题目描述] 小A 和小 ...
- 开车旅行 【NOIP2012 D1T3】
开车旅行 [NOIP2012 D1T3] 倍增 首先令\(a[i]\)表示从i出发最近的城市下标,\(b[i]\)表示从i出发第二近的城市下标 可以维护一个\(\text{set<pair< ...
- 洛谷 P1081 开车旅行(70)
P1081 开车旅行 题目描述 小AA 和小BB 决定利用假期外出旅行,他们将想去的城市从 11到 NN 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 ii的海 ...
- 开车旅行 2012年NOIP全国联赛提高组(倍增+set)
开车旅行 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小A 和小B决定利用 ...
- P1081 [NOIP2012]开车旅行[倍增]
P1081 开车旅行 题面较为啰嗦.大概概括:一个数列,只能从一个点向后走,两种方案:A.走到和自己差的绝对值次小的点B.走到和自己差的绝对值最小点:花费为此差绝对值:若干询问从规定点向后最多花 ...
随机推荐
- 在ArcMap 10.3中创建和编辑数据
在ArcMap 10.3中创建和编辑数据 .......待补充 新建 创建一个新文件((Points, Polylines, and Polygons/点.线.多边形)
- 丢失Ref Edit Control的解决方法
2010版本excel编制的带有控件的VBA,换在别的电脑使用有可能会出现“找不到工程或库”的错误,在VBE编辑器,打开工具——引用,可以看到“丢失 Ref Edit Control”解决方法是,先把 ...
- C# EXCEL(.xls和.xlsx)导入到数据库
C# EXCEL(.xls和.xlsx)导入到数据库 转(http://www.cnblogs.com/bart-cai/articles/2716555.html) 原理:1.判断是否是Excel ...
- OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态
主键生成策略 sequence 数据库端 native 数据库端 uuid 程序端 自动赋值 生成的是一个32位的16进制数 实体类需把ID改成String 类型 assigned 程序端 需手 ...
- Swift和Objective-C混编注意
前言 Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛.当然这对新入行的童鞋们来讲,的确算是福音,但对于整个iOS编程从业者来讲 ...
- sqlserver 修改替换text,ntext类型字段的两种方案
方案一 用Update和Replace --替换语句(因为varchar(max)最大值是8000,所以大于8000的部分会被截掉) UPDATE dbo.SNS_UserBlog SET [Desc ...
- 20145236 冯佳 《Java程序设计》第1周学习总结
20145236 冯佳 <Java程序设计>第1周学习总结 教材学习内容总结 因为假期在家的时候并没有提前自学Java,所以,这周算是真正开始第一次接触Java.我对Java的了解也仅仅停 ...
- css3内容溢出属性
overflow是css2.0的属性,css3中新增了overflow-x和overflow-y属性. overflow-x主要是用来定义对水平方向内容溢出的剪切,而overflow-y主要是用来定义 ...
- js控制html元素的readonly属性
html元素假设为只读,那么其readonly="readonly",我们现在想通过js来改变readonly属性为可以输入. 初始时,两个输入框都是只读.点击change按钮后, ...
- 菜鸟开始学习SSDT HOOK((附带源码)
看了梦无极的ssdt_hook教程,虽然大牛讲得很细,但是很多细节还是要自己去体会,才会更加深入.在这里我总结一下我的分析过程,若有不对的地方,希望大家指出来.首先我们应该认识 ssdt是什么?从梦无 ...