【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 觉得,尽管多次到达同一个地方, ...
随机推荐
- iOS 获取导航栏和状态栏的高度
CGRect rect = [[UIApplication sharedApplication] statusBarFrame]; 状态栏的高度: float status height = rec ...
- Javascript--cookie创建与查看
创建cookie 以下代码将创建一个cookie,该cookie名称为UserName,值为Paul,过期时间为7天后(2015年6月29日) <span style="font-si ...
- Office Add-in 设计规范与最佳实践
作者:陈希章 发表于 2017年8月6日 引子 离上一篇Office Add-in的文章已经过去了一段时间,期间有去年Office 365 Asia Devday & Hackathon的二等 ...
- 小白的Python之路 day3 函数式编程,高阶函数
函数式编程介绍 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的 ...
- SUID、SGID、Sticky BIT
添加SUID: chmod 4755 可执行文件名 或 chmod u+s 可执行文件名 删除SUID: chmod 755 可执行文件名 或 chmod u-s 可执行文件名 [root@local ...
- 【java】文件操作java.io.File
package 文件操作; import java.io.File; import java.io.IOException; public class TestFile { public static ...
- 【java】java.util.regex.Pattern和java.util.regex.Matcher简单示例
package 正则; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test_regex ...
- iOS动态性 运行时runtime初探(强制获取并修改私有变量,强制增加及修改私有方法等)
借助前辈的力量综合一下资料. OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法.利用runtime机制让我们可以在程序运行时动态修改类.对象中的所有属性.方法,就算是 ...
- iOS 去掉小数点后边多余的0
-(NSString*)removeFloatAllZero:(NSString*)string { NSString * testNumber = string; NSString * outNum ...
- Python 初体验
2017的最后一天,在QC的谆谆教诲下,我终于写(背)了九道题,对Python的基本语法有了一个大致了解. 1.A+B+C 就是为了练输入,line=input().split() 录入列表,分割开 ...