开车旅行[巧妙的倍增][set]

2024-01-30 02:38
文章标签 set 倍增 巧妙 旅行 开车

本文主要是介绍开车旅行[巧妙的倍增][set],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门

对于找第一第二近,用set+lower_bound,预处理出nxt_A nxt_B 表示A,B下一步走到哪里

然后倍增 , st_A[i][j] 表示从i往后2^j步A走了多少 B同理

nxt[i][j] 表示往后走2^j步的位置

类似lca那样预处理就好了


//一直RE但对拍一小时后的伪AC代码
#include<bits/stdc++.h>
#define N 500005
#define inf 0x3fffffff
#define LL long long 
using namespace std;
LL n,x0,m;
LL a[N],h[N];
set<LL> S;
LL nxt_A[N] , nxt_B[N] , H_A[N] , H_B[N];
LL nxt[N][20] , st_A[N][20] , st_B[N][20];
LL read(){LL cnt=0,f=1;char ch=0;while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))cnt=cnt*10+(ch-'0'),ch=getchar();return cnt*f; 
}
void getab(LL x,LL pos,LL &ans1,LL &ans2){for(LL i=18;i>=0;i--){if(st_A[pos][i] + st_B[pos][i] <= x && nxt[pos][i]){ans1 += st_A[pos][i];ans2 += st_B[pos][i];x -= (st_A[pos][i] + st_B[pos][i]);pos = nxt[pos][i]; }}if(nxt_A[pos] && st_A[pos][0] <= x) ans1 += st_A[pos][0];
}
int main(){n=read();for(LL i=1;i<=n;i++) a[i]=read(),h[a[i]]=i;S.insert(inf) , S.insert(-inf);S.insert(a[n]) , S.insert(a[n-1]);nxt_B[n-1] = n; for(LL i=n-2;i>=1;i--){LL nxt = *S.lower_bound(a[i]);LL pre = *--S.lower_bound(a[i]);set<LL>::iterator it;it = S.lower_bound(nxt); if(*it!=inf) ++it;LL nxt_nxt = *it;it = S.lower_bound(pre); if(*it!=-inf) --it;LL pre_pre = *it;if(nxt_nxt-a[i] < a[i]-pre) nxt_A[i] = h[nxt_nxt] , nxt_B[i] = h[nxt];else if(a[i]-pre_pre <= nxt-a[i]) nxt_A[i] = h[pre_pre] , nxt_B[i] = h[pre]; else if(nxt-a[i] < a[i]-pre) nxt_A[i] = h[pre] , nxt_B[i] = h[nxt];else nxt_A[i] = h[nxt] , nxt_B[i] = h[pre];S.insert(a[i]);}for(LL i=1;i<n;i++) nxt[i][0] = nxt_B[nxt_A[i]];for(LL i=1;i<=n;i++){if(nxt_A[i]) st_A[i][0] = H_A[i] = abs(a[nxt_A[i]] - a[i]);if(nxt_B[i]) H_B[i] = abs(a[nxt_B[i]] - a[i]);if(nxt[i][0]) st_B[i][0] = abs(a[nxt[i][0]] - a[nxt_A[i]]);}	for(LL i=1;i<=18;i++)for(LL j=1;j<=n;j++){nxt[j][i] = nxt[nxt[j][i-1]][i-1];st_A[j][i] = st_A[j][i-1] + st_A[nxt[j][i-1]][i-1];st_B[j][i] = st_B[j][i-1] + st_B[nxt[j][i-1]][i-1];}x0=read();LL u1=1,u2=0,H=0;LL ans=1;for(LL i=1;i<=n;i++){LL f1=0,f2=0;getab(x0,i,f1,f2);if(!f2) continue;if(f2*u1 > f1*u2 || (f2*u1 == f1*u2 && a[i]>H)) u1=f1 , u2=f2 , H=a[i] , ans=i;}printf("%lld\n",ans);m=read();while(m--){LL s=read(),x=read();LL f1=0,f2=0;getab(x,s,f1,f2);printf("%lld %lld\n",f1,f2);}return 0;
}

 

这篇关于开车旅行[巧妙的倍增][set]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658866

相关文章

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?id=KS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的,这引发了人们的担忧和猜测,即它们可能已

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到

Android set Tag, findViewWithTag使用

设置了tag为“principal”的view ImageView principal = (ImageView) findViewById(R.id.imagen_home_0);principal.setTag("principal"); 在其它地方获取,获取已经设置了tag为“principal”的view LayoutInflater inflater = LayoutInflate

C++ STL关联容器Set与集合论入门

1. 简介 Set(集合)属于关联式容器,也是STL中最实用的容器,关联式容器依据特定的排序准则,自动为其元素排序。Set集合的底层使用一颗红黑树,其属于一种非线性的数据结构,每一次插入数据都会自动进行排序,注意,不是需要排序时再排序,而是每一次插入数据的时候其都会自动进行排序。因此,Set中的元素总是顺序的。 Set的性质有:数据自动进行排序且数据唯一,是一种集合元素,允许进行数学上的集合相

Eclipse或MyEclipse中Java Working Set管理项目

随着学习JAVA的时间的越来越久,项目也越来越多,Eclipse或MyEclipse界面中显示一堆! 每次工作使用到的项目肯定不会太多...... 每次从这么大数量的工程当中找到自己要使用的, 必须大规模的滚动滚动条...... 图片一   Project Explorer中:    图片二:Package Explorer中: 这样就好找很多了,分类放!

STL set整理

#include<set>#include<cstdio>#include<iterator>#include<iostream>#include<algorithm>using namespace std;//set 集合的操作//multisetset<int>Set1;set<int>Set2;set<int>Set3;/*begin() 返回指向第一个元素的迭代器

解决PHP Warning: strftime(): It is not safe to rely on the system's timezone set

当运行一些程序时,在httpd日志中会有如下警告日志: PHP Warning:  strftime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set(