原题传送门

这道坑爹题调了我2小时233~

首先这道题可以用set,平衡树,双向链表等一堆非(sang)常(xin)简(bing)单(kuang)的算法搞出对于任何一个高度h[i]的前2名和后2名

然后我们看到这个

就想到了倍增。。。

但是调不出来o(≧口≦)o

还要特判一下A走后B就不走了的情况。。(用va[i][0]表示)

然后第一问O(N)。。第二问O(M)

最后在黄学长的blog的帮助之下才调了出来。。

真是zxyer说的纯模拟大水比题目啊(233~)

简直跟A*八数码有的一拼。。

下面贴代码

#include<iostream>
#include<set>
#include<map>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define inf 5000000000LL
using namespace std;
int h[100005];
int fa[100005],fb[100005];
long long a[100005],b[100005],va[100005][17],vb[100005][17],to[100005][17];
int n,m;
struct data{
long long key,h;
}t[5]; inline bool operator<(data a,data b)
{
return a.key<b.key||(a.key==b.key&&a.h<b.h);
}
set <long long> q;
map <long long,int> mp;
void pre(){
for(int i=n;i;i--)
{
q.insert(h[i]);
t[1].h=*--q.lower_bound(h[i]);t[2].h=*q.upper_bound(h[i]);
if(t[1].h!=-inf)t[3].h=*--q.lower_bound(t[1].h);
else t[3].h=-inf;
if(t[2].h!=inf)t[4].h=*q.upper_bound(t[2].h);
else t[4].h=inf;
for(int k=1;k<=4;k++)
t[k].key=abs(t[k].h-h[i]);
sort(t+1,t+5);
a[i]=t[2].key;fa[i]=mp[t[2].h];
b[i]=t[1].key;fb[i]=mp[t[1].h];
for(int j=0;j<=16;j++)
if(j==0)
{
if(fa[i]){va[i][0]=a[i];to[i][0]=fa[i];}
}
else if(j==1)
{
if(fb[fa[i]]){va[i][1]=a[i];vb[i][1]=b[fa[i]];to[i][1]=fb[fa[i]];}
}
else
if(to[to[i][j-1]][j-1])
{
va[i][j]=va[i][j-1]+va[to[i][j-1]][j-1];
vb[i][j]=vb[i][j-1]+vb[to[i][j-1]][j-1];
to[i][j]=to[to[i][j-1]][j-1];
}
else break;
}
}
double cal1(int x,int val)
{
int t1=0,t2=0;
for(int i=16;i>=0;i--)
if(to[x][i]&&t1+va[x][i]+vb[x][i]+t2<=val)
{
t1+=va[x][i];t2+=vb[x][i];
x=to[x][i];
}
if(t2==0)return inf;
return (double)t1/(double)t2;
}
void cal2(int x,int val)
{
int t1=0,t2=0;
for(int i=16;i>=0;i--)
if(to[x][i]&&t1+va[x][i]+vb[x][i]+t2<=val)
{
t1+=va[x][i];
t2+=vb[x][i];
x=to[x][i];
}
printf("%d %d\n",t1,t2);
}
void solve1(){
double mn=1e60;int ans;
int num;
scanf("%d",&num);
for(int i=1;i<=n;i++)
{
double t=cal1(i,num);
if(t<mn||t==mn&&h[i]>h[ans])
{
mn=t;
ans=i;
}
}
printf("%d\n",ans);
}
void solve2(){
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int s,x;
scanf("%d%d",&s,&x);
cal2(s,x);
}
}
int main(){
scanf("%d",&n);
q.insert(-inf);q.insert(inf);
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
mp[h[i]]=i;
}
pre();
solve1();
solve2();
return 0;
}

  

开车旅行(NOIP2012)的更多相关文章

  1. Luogu 1081 【NOIP2012】开车旅行 (链表,倍增)

    Luogu 1081 [NOIP2012]开车旅行 (链表,倍增) Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已 ...

  2. Cogs 1264. [NOIP2012] 开车旅行(70分 暴力)

    1264. [NOIP2012] 开车旅行 ★★☆   输入文件:drive.in   输出文件:drive.out   简单对比时间限制:2 s   内存限制:128 MB [题目描述] 小A 和小 ...

  3. 开车旅行 【NOIP2012 D1T3】

    开车旅行 [NOIP2012 D1T3] 倍增 首先令\(a[i]\)表示从i出发最近的城市下标,\(b[i]\)表示从i出发第二近的城市下标 可以维护一个\(\text{set<pair< ...

  4. [NOIP2012提高组]开车旅行

    题目:洛谷P1081.Vijos P1780.codevs1199. 题目大意:有n座海拔高度不相同的城市(编号1~n),两城市的距离就是两城市海拔之差.规定每次只能从编号小的城市走到编号大的城市. ...

  5. P1081 [NOIP2012]开车旅行[倍增]

    P1081 开车旅行    题面较为啰嗦.大概概括:一个数列,只能从一个点向后走,两种方案:A.走到和自己差的绝对值次小的点B.走到和自己差的绝对值最小点:花费为此差绝对值:若干询问从规定点向后最多花 ...

  6. luoguP1081 开车旅行 题解(NOIP2012)

    这道题是真滴火!(一晚上加一节信息课!) 先链接一下题目:luoguP1081 开车旅行 首先,这个预处理就极其变态,要与处理出每一个点往后走A会去哪里,B会去哪里.而且还必须O(nlogn)给它跑出 ...

  7. CH5701 开车旅行

    题意 5701 开车旅行 0x50「动态规划」例题 描述 小A和小B决定利用假期外出旅行,他们将想去的城市从1到N编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 ...

  8. 2012Noip提高组Day1 T3 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  9. 洛谷 P1081 开车旅行(70)

    P1081 开车旅行 题目描述 小AA 和小BB 决定利用假期外出旅行,他们将想去的城市从 11到 NN 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 ii的海 ...

随机推荐

  1. C语言指针篇(二)多级指针

        多级指针         多级指针常常使用于数组.这里仅仅介绍一下它长什么样,后文会再次详细对比使用.         多级指针呢,常见的有二级指针.见图.             二级指针的 ...

  2. https://www.cnblogs.com/gaoxiang12/p/3695962.html

    https://www.cnblogs.com/gaoxiang12/p/3695962.html

  3. [CodeForces238E]Meeting Her(图论+记忆化搜索)

    Description 题目链接:Codeforces Solution 因为路线随机,所以找出各路线最短路必须经过的点,在这个点必定能上车 直接floyd暴力找割点 然后不断用k条公交车路线来更新D ...

  4. 十五、mac 中登陆mysql忘记密码解决办法

    mac 中登陆mysql忘记密码解决办法 1.打开终端,输入命令:cd /usr/local/mysql/bin 2.mysql -uroot -p,用这条命令登陆时报错信息: 报错:Enter pa ...

  5. SpringMVC---web.xml配置详解

    web.xml中需要配置的内容 1.配置监听器<listener> 它有两个监听器: 1). <!--配置文件加载监听器--> <listener> <lis ...

  6. 2-安装linux7

    1.操作系统简介 操作系统: 桌面操作系统 redhat fedora slackware ubuntu debian suse linux centos 服务器操作系统 linux redhat s ...

  7. 解决不了bug的时候看一下:

    解决不了bug的时候看一下: 1.机器是不会出错的,出错的一定是人.只是你还没有意识到哪里出了错. 2.产生bug 的原因想错了,你以为是系统的bug ,那么你肯定就不想着去解决,你也就解决不了. 这 ...

  8. nosetests

    1.nosetests 执行出测试报告 提前安装 插件nose-html系列插件   nosetests -v --with-html-output --html-out-file=报告名.html ...

  9. Unity插件

    1.2D Toolkit 如果过去你一直从事3D游戏开发,最近想转做2D游戏,最好尝试一下2D Toolkit.2D Toolkit是一款2D开发组件,它具有很强的灵活性和适应性,能够让开发者在Uni ...

  10. codebolocks 中文使用手册1.1

    Code::Blocks手册 使用篇 中文翻译版- 原手册下载:http://www.codeblocks.org/docs/manual_en.pdf 译者:JGood 译者言:工欲善其事,必先利其 ...