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$,我们有链表和平衡树可以解决这个问题( ...
随机推荐
- 《图说VR入门》——入门汇总
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/53818922 作者:car ...
- python 回溯法 子集树模板 系列 —— 6、排课问题
问题 某乡村小学有六个年级,每个年级有一个班,共六个班. 周一到周五,每天上6节课,共计30节课. 开设的课程 一年级:语(9)数(9)书(2)体(2)美(2)音(2)德(2)班(1)安(1) 二年级 ...
- [Deep-Learning-with-Python] Keras高级概念
Keras API 目前为止,介绍的神经网络模型都是通过Sequential模型来实现的.Sequential模型假设神经网络模型只有一个输入一个输出,而且模型的网络层是线性堆叠在一起的. 这是一个经 ...
- proftpd启动失败提示unable to determine IP address of “xxx.com”
proftpd启动失败提示unable to determine IP address of “xxx.com”这种proftpd启动失败的原因是无法解析后面主机的IP地址,解决方法是在DNS列表中增 ...
- P4292 [WC2010]重建计划
无脑上二分+淀粉质完事了 每个子树算的时候把儿子按照最长路径从小到大依次做,和前面的单调队列算一波,每个儿子的复杂度不超过这个子树大小 // luogu-judger-enable-o2 #inclu ...
- cocos2d-x学习记录1——图片显示
这篇算是cocos2d-x入门篇,显示一张图片即可. 观察工程中HelloWorld的结构,包含AppDelegate和HelloWorldScene两个类文件,AppDelegate中包含基本的处理 ...
- pt-online-schema-change的实现原理
pt-online-schema-change用于MySQL的在线DDL. 下面结合官方文档和general log来分析其实现原理. 测试表 mysql> show create table ...
- LeetCode 3Sum (Two pointers)
题意 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all ...
- WPF DataGrid列设置为TextBox控件的相关绑定
在wpf的DataGrid控件中,某一列的数据模板为TextBox控件的话,绑定Text="{Binding TxtSn, UpdateSourceTrigger=PropertyChang ...
- MOSFET简介以及PMOS和NMOS的差异
最近在工作中,一直在调试关于MOSFET的电路.在设计过程中发现了PMOS和NMOS的差异,在此记录. 一. MOSFET简介 MOSFET (metal-oxide-semiconductor fi ...