题解

双向链表加倍增。。。

正写着不一定能写对2333

终于写对了。。。

然而我的双向链表和别人的都不一样。。。

瑟瑟发抖。。。

代码

//by 减维
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<map>
#include<algorithm>
#define ll long long
#define inf (9223372036854775807LL)
using namespace std; struct biao{
int i,to,fr;
ll v;
}e[]; int n,m,hest,ys[],zj[],cj[],f[][];
ll x,her,a[][],b[][],h[]; bool cmp(const biao&x,const biao&y){return x.v>y.v;}
bool cm2(const biao&x,const biao&y){return x.i<y.i;} int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i)
{
scanf("%lld",&e[i].v),e[i].i=i,h[i]=e[i].v;
if(h[i]>her) her=h[i],hest=i;
}
sort(e+,e+n+,cmp);
for(int i=;i<=n;++i)
e[i].fr=e[i-].i,e[i].to=e[i+].i;
sort(e+,e+n+,cm2);
for(int i=;i<=n;++i)
{
ll m1=inf,m2=inf,hh[];int pos[],a1,a2; hh[]=abs(h[i]-h[e[i].fr]); pos[]=e[i].fr;
hh[]=abs(h[i]-h[e[e[i].fr].fr]); pos[]=e[e[i].fr].fr;
hh[]=abs(h[i]-h[e[i].to]); pos[]=e[i].to;
hh[]=abs(h[i]-h[e[e[i].to].to]); pos[]=e[e[i].to].to; if(e[i].fr==)hh[]=inf;
if(e[e[i].fr].fr==)hh[]=inf;
if(e[i].to==)hh[]=inf;
if(e[e[i].to].to==)hh[]=inf; for(int j=;j<=;++j)
if(m1>hh[j]||(m1==hh[j]&&h[a1]>h[pos[j]]))m2=m1,a2=a1,m1=hh[j],a1=pos[j];
else
if(m2>hh[j]||(m2==hh[j]&&h[a2]>h[pos[j]]))m2=hh[j],a2=pos[j]; if(m1!=inf)zj[i]=a1;
if(m2!=inf)cj[i]=a2;
if(e[i].fr!=)e[e[i].fr].to=e[i].to;
if(e[i].to!=)e[e[i].to].fr=e[i].fr; }
for(int i=;i<=n;++i)
{
f[i][]=zj[cj[i]];
if(i<=n-)
a[i][]=abs(h[i]-h[cj[i]]);
if(i<=n-)
b[i][]=abs(h[cj[i]]-h[zj[cj[i]]]);
}
for(int i=;i<=;++i)
for(int j=;j<=n;++j)
{
f[j][i]=f[f[j][i-]][i-];
a[j][i]=a[j][i-]+a[f[j][i-]][i-];
b[j][i]=b[j][i-]+b[f[j][i-]][i-];
} scanf("%lld",&x);
int ans=;
double m1=inf;
ll mh=-;
for(int i=;i<=n;++i)
{
int pos=i;
ll l=x,disa=,disb=;
for(int j=;j>=;--j)
{
if(f[pos][j]!=&&a[pos][j]+b[pos][j]<=l)
{
disa+=a[pos][j];
disb+=b[pos][j];
l-=a[pos][j]+b[pos][j];
pos=f[pos][j];
}
}
if(a[pos][]<=l){
disa+=a[pos][];
l-=a[pos][];
}
double c=inf;
if(disb==) c=inf;
else c=disa*1.0/disb;
if(c<m1||(c==m1&&h[i]>mh))
{
m1=c;
mh=h[i];
ans=i;
}
}
if(m1!=inf)printf("%d\n",ans);
else printf("%d\n",hest);
scanf("%d",&m);
for(int i=;i<=m;++i)
{
int s;
scanf("%d%lld",&s,&x);
int pos=s;
ll l=x,disa=,disb=;
for(int j=;j>=;--j)
{
if(f[pos][j]!=&&a[pos][j]+b[pos][j]<=l)
{
disa+=a[pos][j];
disb+=b[pos][j];
l-=a[pos][j]+b[pos][j];
pos=f[pos][j];
}
}
if(a[pos][]<=l){
disa+=a[pos][];
l-=a[pos][];
}
printf("%lld %lld\n",disa,disb);
}
}

【NOIP2012】旅行计划的更多相关文章

  1. COGS 2. 旅行计划

    2. 旅行计划 ★☆   输入文件:djs.in   输出文件:djs.out   简单对比时间限制:3 s   内存限制:128 MB 过暑假了,阿杜准备出行旅游,他已经查到了某些城市的两两之间的距 ...

  2. Crash的旅行计划

    除草了.. Crash的旅行计划 [问题描述] 过不了多久,Crash就要迎来他朝思暮想的暑假.在这个暑假里,他计划着到火星上旅游.在火星上有N个旅游景点,Crash用1至N这N个正整数对这些景点标号 ...

  3. 【51Nod】1273 旅行计划 树上贪心

    [题目]51Nod 1273 旅行计划 [题意]给定n个点的树和出发点k,要求每次选择一个目的地旅行后返回,使得路径上未访问过的点最多(相同取编号最小),旅行后路径上所有点视为访问过,求旅行方案.\( ...

  4. 51nod 1273 旅行计划——思维题

    某个国家有N个城市,编号0 至 N-1,他们之间用N - 1条道路连接,道路是双向行驶的,沿着道路你可以到达任何一个城市.你有一个旅行计划,这个计划是从编号K的城市出发,每天到达一个你没有去过的城市, ...

  5. 洛谷P1137 旅行计划

    P1137 旅行计划 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出发,并只往东走到城市i停止. 所以他就需要选择最先到达的城市,并制 ...

  6. 洛谷 P1137 旅行计划

    旅行计划 待证明这样dp的正确性. #include <iostream> #include <cstdio> #include <cstring> #includ ...

  7. 51nod-1273: 旅行计划

    [传送门:51nod-1273] 简要题意: 给出一棵树,点数为n,现在你有一个旅行计划,从k城市出发,每天前往一个没去过的城市,并且旅途中经过的没有去过的城市尽可能的多(如果有2条路线,经过的没有去 ...

  8. 牛客-小a的旅行计划 + 数学推导

    小a的旅行计划 题意: 小a终于放假了,它想在假期中去一些地方游玩,现在有N个景点,编号为,同时小b也想出去游玩.由于一些特殊♂原因,他们的旅行计划必须满足一些条件 首先,他们可以从这N个景点中任意选 ...

  9. Problem 2 旅行计划 (travelling .cpp)———2019.10.6

    lth tql,lzpclxf tql Orz Problem 2 旅行计划 (travelling.cpp)[题目描述]小 Z 打算趁着暑假,开启他的旅行计划.但与其他同学不同的是,小 Z 旅行时并 ...

  10. 【csp模拟赛4】旅行计划 (travelling.cpp)--欧拉回路

    [题目描述] 小 Z 打算趁着暑假,开启他的旅行计划.但与其他同学不同的是,小 Z 旅 行时并不关心到达了哪个网红景点打了哪些卡.小 Z 更关注沿路的风光,而且 小 Z 觉得,尽管多次到达同一个地方, ...

随机推荐

  1. caffe在windows编译project及执行mnist数据集測试

    caffe在windows上的配置和编译能够參考例如以下的博客: http://blog.csdn.net/joshua_1988/article/details/45036993 http://bl ...

  2. iOS_20_微博OAuth授权_取得用户授权的accessToken

    终于效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill ...

  3. 联通假4G欺骗消费者!

    之前预约了联通4G升级,官网说从4月18日開始到5月1月生效.4月18日到5月1日之间10010会联系预约用户更改套餐.24号收到联通业务员打来电话,明白告知:联通4G仅仅是套餐是4G的.网络还是3G ...

  4. 页面的新开页,window.open的hacker

    一.window.open如何进行hack 网上看的办法很多,归根接地还是不能解决掉,只有通过a标签的target属性 $obj.click(function(){  var newTab=windo ...

  5. SSM学习(三)--集成spring mvc

    spirng mvc是一个mvc框架,与struts2类似,都是基于Servlet封装而成的框架,所以要了解spring mvc或者struts2比需先了解Servlet,本篇我们先把spring m ...

  6. 【转载】Java 类加载与初始化

    原文地址:http://www.cnblogs.com/zhguang/p/3154584.html 目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在J ...

  7. iOS白名单设置

    在做分享.支付的时候需要跳转到对应的app,这里有需要设置的白名单列表<key>LSApplicationQueriesSchemes</key> <array> ...

  8. 【CSS3】内联、内部、外部样式,样式优先级、层叠、继承

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. Boost Coroutine2 - stackful coroutine简介

    协程可以很轻量的在子例程中进行切换,它由程序员进行子例程的调度(即切换)而不像线程那样需要内核参与,同时也省去了内核线程切换的开销,因为一个协程切换保留的就是函数调用栈和当前指令的寄存器,而线程切换需 ...

  10. python 字符串中的%s与format

    你可以选择字符串拼接,你也可以选择使用%s或者是format,下面简单介绍一下它们的使用方法: # 在字符串后面跟%,然后后面加上要被替换的值 print('I like %s' % 'apples' ...