noip 2012 开车旅行
/*考场上写的暴力 40分钟70分*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define base 1000000000
#define maxn 100010
#define ll long long
using namespace std;
ll n,m,h[maxn],X,A[maxn],B[maxn],st,ans;
bool falg;
double mii=base;
ll init()
{
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
ll Abs(ll a)
{
return a<?-a:a;
}
void Get_AB()
{
for(int i=;i<=n;i++)
{
ll mxx,mx,mxxh,mxh,kxx=,kx=;mxx=mx=0x7fffffff;
for(int j=i+;j<=n;j++)
{
ll C=Abs(h[i]-h[j]);
if(C<mxx||(C==mxx&&h[j]<mxxh))
mx=mxx,mxx=C,mxh=mxxh,mxxh=h[j],kx=kxx,kxx=j;
else if((C==mxx&&h[j]>=mxxh)||C<mx||(C==mx&&h[j]<mxh))
mx=C,mxh=h[j],kx=j;
}
A[i]=kx;B[i]=kxx;
}
}
void Dfs(ll now,ll who,ll As,ll Bs,ll limit,ll S)
{
if(falg)return;ll s1=,s2=;double tmp;
if(!who)s1=As+Abs(h[now]-h[A[now]]),S+=Abs(h[now]-h[A[now]]);
if(who)s2=Bs+Abs(h[now]-h[B[now]]),S+=Abs(h[now]-h[B[now]]);
if(S>limit||(!who&&A[now]==)||(who&&B[now]==))
{
if(!Bs)tmp=base;
else tmp=double(As)/double(Bs);
if(tmp<mii||(tmp==mii&&h[st]>h[ans]))
ans=st,mii=tmp;
falg=;return ;
}
if(!who&&s1<=limit)Dfs(A[now],!who,s1,Bs,limit,S);if(falg)return;
if(who&&s2<=limit)Dfs(B[now],!who,As,s2,limit,S);if(falg)return;
if(!Bs)tmp=base;
else tmp=double(As)/double(Bs);
if(tmp<mii||(tmp==mii&&h[st]>h[ans]))
ans=st,mii=tmp;
falg=;return ;
}
void dfs(ll now,ll who,ll As,ll Bs,ll limit,ll S)
{
if(falg)return;ll s1=,s2=;
if(!who)s1=As+Abs(h[now]-h[A[now]]),S+=Abs(h[now]-h[A[now]]);
if(who)s2=Bs+Abs(h[now]-h[B[now]]),S+=Abs(h[now]-h[B[now]]);
if(S>limit||(!who&&A[now]==)||(who&&B[now]==))
{
cout<<As<<" "<<Bs<<endl;
falg=;return;
}
if(!who&&s1<=limit)dfs(A[now],!who,s1,Bs,limit,S);if(falg)return;
if(who&&s2<=limit)dfs(B[now],!who,As,s2,limit,S);if(falg)return;
cout<<As<<" "<<Bs<<endl;
falg=;return;
}
int main()
{
n=init();int x,s;
for(int i=;i<=n;i++)
{
x=init();h[i]=x+base;
}
Get_AB();X=init();
for(int i=;i<=n;i++)
falg=,st=i,Dfs(i,,,,X,);
cout<<ans<<endl;
m=init();
for(int i=;i<=m;i++)
{
s=init();x=init();
falg=;dfs(s,,,,x,);
}
return ;
}
/*
暴力的复杂度是n*n的
首先预处理每个点的最短次短距离就Tle了
这里我们借助set O n 的解决这个问题
然后对于每个询问 利用倍增 logn的实现就不超时了
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<cmath>
#define base 100000000000//大大大大大
#define maxn 100010
#define ll long long
using namespace std;
ll n,m,X,A[maxn],B[maxn],As[maxn],Bs[maxn],ans;
ll d[maxn][],f[maxn][][];
double mii=base;
struct point
{
ll o,hi;
bool operator < (const point & a) const
{
return hi<a.hi;
}
}p[maxn];
set<point>s;
set<point>::iterator pi;
ll init()
{
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
ll abs(ll a)
{
return a<?-a:a;
}
void Add(point x,point y)
{
if(!B[x.o])
{
B[x.o]=y.o;
Bs[x.o]=abs(x.hi-y.hi);
}
else if(abs(x.hi-y.hi)<Bs[x.o]||(abs(x.hi-y.hi)==Bs[x.o]&&y.hi<p[B[x.o]].hi))
{
A[x.o]=B[x.o];
As[x.o]=Bs[x.o];
B[x.o]=y.o;
Bs[x.o]=abs(x.hi-y.hi);
}
else if(abs(x.hi-y.hi)<As[x.o]||(abs(x.hi-y.hi)==As[x.o]&&y.hi<p[A[x.o]].hi))
{
A[x.o]=y.o;
As[x.o]=abs(x.hi-y.hi);
}
else if(!A[x.o])
{
A[x.o]=y.o;
As[x.o]=abs(x.hi-y.hi);
}
return;
}
void Get_AB()
{
for(int i=n;i>=;i--)
{
s.insert(p[i]);
pi=s.find(p[i]);
if(pi!=s.begin())
{
pi--;Add(p[i],*pi);
if(pi!=s.begin())
{
pi--;Add(p[i],*pi);pi++;
}
pi++;
}
if((++pi)!=s.end())
{
Add(p[i],*pi);
if((++pi)!=s.end())
Add(p[i],*pi);
pi--;
}
pi--;
}
}
void Query(int st,ll limit,ll & sa,ll & sb)
{
for(int i=;i>=;i--)
if(f[st][i][]+f[st][i][]<=limit&&d[st][i])
{
sa+=f[st][i][];sb+=f[st][i][];
limit-=(f[st][i][]+f[st][i][]);st=d[st][i];
}
if(A[st]&&As[st]<=limit)
sa+=As[st];
}
int main()
{
n=init();
for(int i=;i<=n;i++)
{
p[i].hi=init();p[i].o=i;
}
Get_AB();
for(int i=;i<=n;i++)
{
d[i][]=B[A[i]];
f[i][][]=As[i];
f[i][][]=Bs[A[i]];
}
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
{
d[i][j]=d[d[i][j-]][j-];
f[i][j][]=f[i][j-][]+f[d[i][j-]][j-][];
f[i][j][]=f[i][j-][]+f[d[i][j-]][j-][];
}
X=init();
for(int i=;i<=n;i++)
{
ll sa=,sb=;double tmp;
Query(i,X,sa,sb);
if(!sb)tmp=base;
else tmp=double(sa)/double(sb);
if(tmp<mii||(tmp==mii&&p[i].hi>p[ans].hi))
ans=i,mii=tmp;
}
cout<<ans<<endl;
m=init();int st;
for(int i=;i<=m;i++)
{
st=init();X=init();
ll sa=,sb=;
Query(st,X,sa,sb);
cout<<sa<<" "<<sb<<endl;
}
return ;
}
noip 2012 开车旅行的更多相关文章
- 【NOIP 2012 开车旅行】***
题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...
- 开车旅行 2012年NOIP全国联赛提高组(倍增+set)
开车旅行 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小A 和小B决定利用 ...
- [NOIP2012] 提高组 洛谷P1081 开车旅行
题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...
- P1081 开车旅行
题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...
- [NOIP2012T3]开车旅行
题目描述 NOIP 2012 提高组 题3小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 ...
- NOIP 2012 Day1
tags: NOIP 模拟 倍增 高精 Python categories: 信息学竞赛 总结 Luogu P1079 Vigenère 密码 Solution 表示并不是很懂其他人发的题解. 我是这 ...
- P1081 [NOIP2012]开车旅行[倍增]
P1081 开车旅行 题面较为啰嗦.大概概括:一个数列,只能从一个点向后走,两种方案:A.走到和自己差的绝对值次小的点B.走到和自己差的绝对值最小点:花费为此差绝对值:若干询问从规定点向后最多花 ...
- NOIp 2012 #2 借教室 Label:区间修改线段树
题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...
- NOIp 2012 #1 Vigenère 密码 Label:模拟
题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...
随机推荐
- ext中嵌入flash
方法1: xtype: 'fieldset', border: 0, title: "", items[{ xtype: 'flash', url: 'Test.swf' }] u ...
- ASP.NET WEB API 2 框架揭秘 读书笔记(一)
第一章 概述 主要内容是介绍Web的基本概念,Restfull的基本概念及特性.最后介绍创建简单WebApi程序的步骤. Web的基本概念 IP/TCP协议簇分层,分为两种 链路层->网络层-& ...
- Mac系统下安装PIL
安装PIL依赖JPEG.Freetype.LittleCMS, 首先安装这三个环境(第一至三步): 第一步:安装JPEG http://www.ijg.org/files/jpegsrc.v8c.ta ...
- C语言指针类型 强制转换
关于C语言指针类型 强制转换 引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...
- 基于fis的前端模块化和工程化方案
前端构建工具 面对日益复杂的前端环境以及前端技术.node技术的高速发展,前端的开发也越来越工程化,体系化,也就是出现了前端自动化构建工具.他们完成的任务目标基本是: js,css,图片的自动压缩合并 ...
- 关于索引degree设置的问题
--并行查询 可以使用并行查询的情况 1. Full table scans, full partition scans, and fast full index scans 2. Index ful ...
- Delphi——Window 消息 - 转载▼
Delphi是Borland公司的一种面向对象的可视化软件开发工具. Delphi集中了Visual C++和Visual Basic两者的优点:容易上手.功能强大,特别是在界面设计.数据库编程.网络 ...
- 9月19号-9月21号丰宁坝上草原行 - 营销系统 - 京东内部论坛 - Powered by Discuz!
9月19号-9月21号丰宁坝上草原行 - 营销系统 - 京东内部论坛 - Powered by Discuz! 9月19号-9月21号丰宁坝上草原行 [复制链接]
- validator 对象
validate方法返回Validator对象,Validator对象有很多种有用的方法: Validator.form()验证表单是否有效,返回true/false Validator.elemen ...
- OpenRisc-41-or1200的cache模块分析
引言 为CPU提供足够的,稳定的指令流和数据流是计算机体系结构设计中两个永恒的话题.为了给CPU提供指令流,需要设计分支预测机构,为了给CPU提供数据流,就需要设计cache了.其实,无论是insn还 ...