【NOIP2012】旅行计划
题解
双向链表加倍增。。。
正写着不一定能写对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】旅行计划的更多相关文章
- COGS 2. 旅行计划
2. 旅行计划 ★☆ 输入文件:djs.in 输出文件:djs.out 简单对比时间限制:3 s 内存限制:128 MB 过暑假了,阿杜准备出行旅游,他已经查到了某些城市的两两之间的距 ...
- Crash的旅行计划
除草了.. Crash的旅行计划 [问题描述] 过不了多久,Crash就要迎来他朝思暮想的暑假.在这个暑假里,他计划着到火星上旅游.在火星上有N个旅游景点,Crash用1至N这N个正整数对这些景点标号 ...
- 【51Nod】1273 旅行计划 树上贪心
[题目]51Nod 1273 旅行计划 [题意]给定n个点的树和出发点k,要求每次选择一个目的地旅行后返回,使得路径上未访问过的点最多(相同取编号最小),旅行后路径上所有点视为访问过,求旅行方案.\( ...
- 51nod 1273 旅行计划——思维题
某个国家有N个城市,编号0 至 N-1,他们之间用N - 1条道路连接,道路是双向行驶的,沿着道路你可以到达任何一个城市.你有一个旅行计划,这个计划是从编号K的城市出发,每天到达一个你没有去过的城市, ...
- 洛谷P1137 旅行计划
P1137 旅行计划 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出发,并只往东走到城市i停止. 所以他就需要选择最先到达的城市,并制 ...
- 洛谷 P1137 旅行计划
旅行计划 待证明这样dp的正确性. #include <iostream> #include <cstdio> #include <cstring> #includ ...
- 51nod-1273: 旅行计划
[传送门:51nod-1273] 简要题意: 给出一棵树,点数为n,现在你有一个旅行计划,从k城市出发,每天前往一个没去过的城市,并且旅途中经过的没有去过的城市尽可能的多(如果有2条路线,经过的没有去 ...
- 牛客-小a的旅行计划 + 数学推导
小a的旅行计划 题意: 小a终于放假了,它想在假期中去一些地方游玩,现在有N个景点,编号为,同时小b也想出去游玩.由于一些特殊♂原因,他们的旅行计划必须满足一些条件 首先,他们可以从这N个景点中任意选 ...
- Problem 2 旅行计划 (travelling .cpp)———2019.10.6
lth tql,lzpclxf tql Orz Problem 2 旅行计划 (travelling.cpp)[题目描述]小 Z 打算趁着暑假,开启他的旅行计划.但与其他同学不同的是,小 Z 旅行时并 ...
- 【csp模拟赛4】旅行计划 (travelling.cpp)--欧拉回路
[题目描述] 小 Z 打算趁着暑假,开启他的旅行计划.但与其他同学不同的是,小 Z 旅 行时并不关心到达了哪个网红景点打了哪些卡.小 Z 更关注沿路的风光,而且 小 Z 觉得,尽管多次到达同一个地方, ...
随机推荐
- 牛腩新闻公布系统--学习Web的小技巧汇总
2014年11月10日,是个难忘的日子.这一天.小编的BS学习開始了.BS的开头,从牛腩新闻公布系统開始.之前学习的内容都是CS方面的知识,软考过后.開始学习BS,接触BS有几天的时间了,跟着牛腩老师 ...
- UML总结复习指南
用例图 1. 參与者(Actor) 表示与您的应用程序或系统进行交互的用户.组织或外部系统.用一个小人表示. 2. 用例(Use Case) 用例就是外部可见的系统功能,对系统提供的服务进行描 ...
- java 线程 捕获异常
java 线程 捕获异常 来自:thinking in java 4 文件夹20.2.13 package org.rui.thread.concurrent; import java.util.c ...
- ABP入门系列(12)——如何升级Abp并调试源码
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1. 升级Abp 本系列教程是基于Abp V1.0版本,现在Abp版本已经升级至V1.4.2(截至 ...
- 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载
<深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...
- HTML5 桌面通知:Notification API
原文地址:http://blog.gdfengshuo.com/article/23/ 前言 Notification API 是 HTML5 新增的桌面通知 API,用于向用户显示通知信息.该通知是 ...
- Python 项目实践三(Web应用程序)第一篇
一 Djangao入门 当今的网站实际上都是富应用程序(rich application),就像成熟的桌面应用程序一样.Python提供了一组开发Web应用程序的卓越工具.在本章中,你将学习如何使用D ...
- Java编程学习知识点分享 入门必看
Java编程学习知识点分享 入门必看 阿尔法颜色组成(alpha color component):颜色组成用来描述颜色的透明度或不透明度.阿尔法组成越高,颜色越不透明. API:应用编程接口.针对软 ...
- JAVA图片批量上传JS-带预览功能
这篇文章就简单的介绍一个很好用的文件上传工具,批量带预览功能.直接贴代码吧,都有注释,很好理解. HTML页面 <!DOCTYPE html> <%@ taglib prefix=& ...
- gitlab 升级
=============================================== 2017/10/21_第1次修改 ccb_warlock = ...