luogu1081 [NOIp2012]开车旅行 (STL::multiset+倍增)
先用不管什么方法求出来从每个点出发,A走到哪、B走到哪(我写了一个很沙雕的STL)
然后把每个点拆成两个点,分别表示A从这里出发和B从这里出发,然后连边是要A连到B、B连到A、边长就是这次走的路径长度
为了方便,把不能继续走的点连到一个假节点1上(不连应该也无所谓)
然后我们预处理倍增,但要把A走的距离和B走的距离分开来算
之后就每次往上跳找第一个不能走的地方,然后算一算答案就行了
(整数除整数别忘了先换成double或者乘个1.0.............)
#include<bits/stdc++.h>
#define pa pair<ll,int>
#define lowb(x) ((x)&(-(x)))
#define REP(i,n0,n) for(i=n0;i<=n;i++)
#define PER(i,n0,n) for(i=n;i>=n0;i--)
#define MAX(a,b) ((a>b)?a:b)
#define MIN(a,b) ((a<b)?a:b)
#define CLR(a,x) memset(a,x,sizeof(a))
#define rei register int
using namespace std;
typedef long long ll;
const int maxn=1e5+,logn=;
const ll inf=1e16; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N,M,fa[maxn<<][logn];
ll h[maxn],dis1[maxn<<][logn],dis2[maxn<<][logn];
multiset<pa > st;
bool flag[maxn<<]; void getfa(int x){
flag[x]=;
if(fa[x][]&&!flag[fa[x][]]) getfa(fa[x][]);
for(int i=;fa[x][i-]&&fa[fa[x][i-]][i-];i++){
fa[x][i]=fa[fa[x][i-]][i-];
dis1[x][i]=dis1[x][i-]+dis1[fa[x][i-]][i-];
dis2[x][i]=dis2[x][i-]+dis2[fa[x][i-]][i-];
}
}
void getdis(ll &d1,ll &d2,int x,ll bnd){
d1=d2=;
for(int i=;i>=;i--){
if(fa[x][i]&&dis1[x][i]+dis2[x][i]<=bnd){
bnd-=dis1[x][i]+dis2[x][i];
d1+=dis1[x][i],d2+=dis2[x][i];
x=fa[x][i];
}
}
} int main(){
// freopen("1081.in","r",stdin);
rei i,j,k;
N=rd();
for(i=;i<=N;i++) h[i]=rd();
st.insert(make_pair(inf,));
for(i=N;i;i--){
multiset<pa>::iterator it=st.lower_bound(make_pair(h[i],));
ll mi=inf;int ma=;
if(it->first!=inf)
mi=it->first-h[i],ma=it->second;
if(it!=st.begin()){
it--;
if(h[i]-it->first<=mi) mi=h[i]-it->first,ma=it->second;
}
fa[i<<|][]=ma?(ma<<):;
dis2[i<<|][]=mi; ll mi2=inf;int ma2=;
if(mi!=inf){
it=st.lower_bound(make_pair(h[i]+mi,));
if(it->first!=inf&&it->first==h[i]+mi&&it->second!=ma){
mi2=mi,ma2=it->second;
}else{
if(it->first!=inf&&it->first-h[i]==mi) it++;
if(it->first!=inf&&it->first-h[i]>mi)
mi2=it->first-h[i],ma2=it->second;
it=st.lower_bound(make_pair(h[i]-mi,));
if(it!=st.begin()){
it--;
if(h[i]-it->first>mi&&h[i]-it->first<=mi2)
mi2=h[i]-it->first,ma2=it->second;
}
}
} fa[i<<][]=ma2?(ma2<<|):;
dis1[i<<][]=mi2;
st.insert(make_pair(h[i],i));
// printf("%d %d %lld %d %lld\n",i,fa[i<<1|1][0],mi,fa[i<<1][0],mi2);
}
// for(i=1;i<=(N<<1|1);i++) printf("%d %d\n",i,fa[i][0]);
for(i=;i<=(N<<|);i++) if(!flag[i]) getfa(i);
int x0=rd();
double mm=inf;int mi=;h[]=-inf;
for(i=;i<=N;i++){
ll d1=,d2=;
getdis(d1,d2,i<<,x0);
if(d2==&&mm==inf&&h[mi]<h[i]) mi=i;
else if(d2!=){
double r=1.0*d1/d2;
if(r<mm||(r==mm&&h[mi]<h[i])) mm=r,mi=i;
}
}
printf("%d\n",mi); M=rd();
for(i=;i<=M;i++){
ll d1=,d2=;
int a=rd();ll b=rd();
getdis(d1,d2,a<<,b);
printf("%lld %lld\n",d1,d2);
}
return ;
}
luogu1081 [NOIp2012]开车旅行 (STL::multiset+倍增)的更多相关文章
- Luogu1081 NOIP2012 开车旅行 倍增
题目传送门 为什么NOIP的题目都这么长qwq 话说2012的D1T3和D2T3都是大火题啊qwq 预处理神题 对于这种跳跳跳的题目考虑使用倍增优化枚举.先预处理某个点之后距离最小和次小的城市,然后倍 ...
- Cogs 1264. [NOIP2012] 开车旅行(70分 暴力)
1264. [NOIP2012] 开车旅行 ★★☆ 输入文件:drive.in 输出文件:drive.out 简单对比时间限制:2 s 内存限制:128 MB [题目描述] 小A 和小 ...
- P1081 [NOIP2012]开车旅行[倍增]
P1081 开车旅行 题面较为啰嗦.大概概括:一个数列,只能从一个点向后走,两种方案:A.走到和自己差的绝对值次小的点B.走到和自己差的绝对值最小点:花费为此差绝对值:若干询问从规定点向后最多花 ...
- NOIP2012开车旅行 【倍增】
题目 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为Hi,城市 i 和城 ...
- luogu1081 开车旅行2012 D1T3 (倍增,set,O2)
题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为Hi,城市 i ...
- 洛谷1081 (NOIp2012) 开车旅行——倍增预处理
题目:https://www.luogu.org/problemnew/show/P1081 预处理从每个点开始a能走多少.b能走多少.可以像dp一样从后往前推. 但有X的限制.所以该数组可以变成倍增 ...
- noip2012开车旅行 题解
题目大意: 给出n个排成一行的城市,每个城市有一个不同的海拔.定义两个城市间的距离等于他们的高度差的绝对值,且绝对值相等的时候海拔低的距离近.有两个人轮流开车,从左往右走.A每次都选最近的,B每次都选 ...
- noip2012 开车旅行
此题100分的解法就是先预处理出每个点的下一个点之后倍增就好了.其实并没有太大难度. pbihao用双向链表写过了此题.在本地上我treap狂操他,but在rqnoj上,我依靠反复提交才A掉此题(最后 ...
- Luogu 1081 [NOIP2012] 开车旅行
感谢$LOJ$的数据让我调掉此题. 这道题的难点真的是预处理啊…… 首先我们预处理出小$A$和小$B$在每一个城市的时候会走向哪一个城市$ga_i$和$gb_i$,我们有链表和平衡树可以解决这个问题( ...
随机推荐
- ccf201703-2学生排队
问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整.一次调整小明可能让一位同学出队,向前或者向后移动一段距离后再插入队列. ...
- TClientDataSet 提交时提示 Field value Required 但是未提示具体哪个字段。
TClientDataSet 提交时提示 Field value Required 但是未提示具体哪个字段. 这个错误特别麻烦,要使用 midas 控件时,虽然很方便.但是出错了根本找不到原因,特别是 ...
- 2017-2018-2 20155231《网络对抗技术》实验五: MSF基础应用
2017-2018-2 20155231<网络对抗技术>实验五: MSF基础应用 实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 实验内容 (1)各种搜索技巧的应用 比如IP2L ...
- 20155307实验八 《网络对抗》 Web基础
20155307实验八 <网络对抗> Web基础 实验过程 Web前端:HTML 使用netstat -aptn查看80端口是否被占用(上次实验设置为Apache使用80端口),如果被占用 ...
- 矩阵乘法&&矩阵快速幂&&最基本的矩阵模型——斐波那契数列
矩阵,一个神奇又令人崩溃的东西,常常用来优化序列递推 在百度百科中,矩阵的定义: 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵.这一 ...
- Kubernetes学习之路(二十)之K8S组件运行原理详解总结
目录 一.看图说K8S 二.K8S的概念和术语 三.K8S集群组件 1.Master组件 2.Node组件 3.核心附件 四.K8S的网络模型 五.Kubernetes的核心对象详解 1.Pod资源对 ...
- libgdx学习记录4——舞台Stage
libgdx总的来说是一个框架,而不是一个成熟的游戏引擎.Stage是其中一个比较好的封装,里面自带Camera.SpriteBatch等常用渲染绘图工具. 下面是一个简单的添加图片,并让镜头左右上下 ...
- 用Spring.Services整合 thrift0.9.2生成的wcf中间代码-复杂的架构带来简单的代码和高可维护性
最近一直在看关于thrift的相关文章,涉及到的内容的基本都是表层的.一旦具体要用到实际的项目中的时候就会遇到各种问题了! 比如说:thrift 的服务器端载体的选择.中间代码的生成options(a ...
- JQuery快速入门-事件与效果
一.事件 事件绑定的方法有两种: 绑定到元素 查找元素后绑定事件 方法1:绑定到元素 <body> <p onclick='func1()'>点击我</p> < ...
- Jq_网站顶部定时折叠广告
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><titl ...