题解

双向链表加倍增。。。

正写着不一定能写对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. outb,inb等I/Oport操作函数

    功能: 如 i386 .在差别 I/O 空间和内存空间的进程的 I/O 空间写入数据. outb()   I/O 上写入 8 位数据 ( 1 字节 ). outw() I/O 上写入 16 位数据 ( ...

  2. UML总结复习指南

    用例图 1. 參与者(Actor) 表示与您的应用程序或系统进行交互的用户.组织或外部系统.用一个小人表示.   2. 用例(Use Case)   用例就是外部可见的系统功能,对系统提供的服务进行描 ...

  3. Hibernate的load()和get()区别

    最近在用Hibernate的时候发现一个问题:比如我们从数据库获得一个对象时,使用session.get()方法还是session.load()?  两种方法在获得一个实体对象时是有区别的,在查询性能 ...

  4. 自学Zabbix3.2-配置功能简介

    zabbix配置功能介绍 zabbix配置内容比较多,我们要分为9大块来讲解.分别如下: 1. 主机与组        添加主机配置与组配置. 1.1.创建主机方法 1.1.1 新建主机      c ...

  5. 关于flask登录视图报错AttributeError: '_AppCtxGlobals' object has no attribute 'user'

    在一个小程序中写了一个登录视图函数,代码如下: @app.route('/login',methods = ['GET','POST']) @oid.loginhandler def login(): ...

  6. idea svn 的使用----转载,挺好的

    Intellij IDEA svn的使用记录 这里的忽略一直灰色的,可以进入 这里的版本控制里进行忽略选择 或者 这里进行添加 这里有三个选择 按照顺序 1.忽略指定的文件 2.忽略文件夹下所有文件 ...

  7. 【批处理】IF ERRORLEVER语句顺序注意

    @echo off dir d:\dddddd if errorlevel 1 goto 1 if errorlevel 0 goto 0 rem 两行if语句不可交换位置,否则失败了也会显示成功. ...

  8. UML2和建模工具学习总结

    软件发展的方向:CS–>BS–>SOA–>BIG DATA 建模的含义: 模型是对现实的简化 从特点视角对系统的一个完整性描述 建模的重要性: 为了更好的理解一个系统 管理复杂度(也 ...

  9. js登录滑动验证,不滑动无法登陆

    js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html; ...

  10. Swift基础学习

    Swift基础学习  http://c.biancheng.net/cpp/html/2242.html 这个网站最近看了一下,对于基本语法解释概括的相对全面,如同重新练习一遍OC似的,挺全面的,谢谢 ...