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$,我们有链表和平衡树可以解决这个问题( ...
随机推荐
- SAP调用RestfulApi接口接收数据
因为准备要做一个关于调用外部接口的需求,所以自己先练习一下. 程序说明:我已经在.net开发的系统里提供一个api接口,现在在sap访问这个接口,来接收数据. 这里涉及Restful Api知识,以后 ...
- 【实战】verilog中`define的使用记录
背景: 在最近实战开发中发现:对外部芯片进行初始化时,往往需要定义大量参数. 若直接在module中通过localparam或者parameter进行参数定义的话,会带来两个问题: 1.代码长度增加, ...
- 欧几里得算法(及扩展)&&快速幂(二分+位运算)
最近在二中苦逼地上课,天天听数论(当然听不懂) 但是,简单的还是懂一点的 1.欧几里得算法 说得这么高级干什么,gcd入门一个月的人都会吧,还需要BB? 证明可参照其他博客(不会),主要就是gcd(a ...
- python 回溯法 子集树模板 系列 —— 4、数字组合问题
问题 找出从自然数1.2.3.....n中任取r个数的所有组合. 例如,n=5,r=3的所有组合为: 1,2,3 1,2,4 1,2,5 1,3,4 1,3,5 1,4,5 2,3,4 2,3,5 2 ...
- 洛谷 P3302 [SDOI2013]森林
->题目链接 题解: #include<queue> #include<cstdio> #include<cstring> #include<iostr ...
- 蓝牙inquiry流程之命令下发
Android 上面的蓝牙inquiry 是在设置界面,打开蓝牙就会自动搜索周边的蓝牙设备,其最终调用到协议栈的start_discovery接口,此篇文章分析该接口的调用流程以及与controlle ...
- 微信小程序之 动画 —— 自定义底部弹出层
wxml: <view class='buy' bindtap='showBuyModal'>立即购买</view> <!-- 点击立即购买 弹出购买遮罩层 --> ...
- Elasticsearch date 类型详解
引言 一直对 elasticsearch 中的 date 类型认识比较模糊,而且在使用中又比较常见,这次决定多花些时间,彻底弄懂它,希望能对用到的同学提供帮助. 注意:本文测试使用是 elastics ...
- [转]申瓯 JSY2000-06 程控电话交换机呼叫转移设置
说明:若申瓯程控电话交换机分机有事不在位置上或遇忙分机正忙时为使某些重要来话不丢失,可设置将呼入本机的电话转移至其他分机及公网固定电话或手机.电话交换机使用了本功能不管分机用户在什么地方都能接听到办公 ...
- Win环境 Android Studio使用Git 教程 ( 生成SSH key )
Github和码云都提供SSH协议,即用户可以用公钥认证方式连接到码云的SSH服务器.这就需要生成并部署SSH Key.下面就是我生成SSH Key的步骤,希望有所帮助: Git生成SSH key 在 ...