P1081 [NOIP2012 提高组] 开车旅行(倍增)(动态规划)

洛谷传送门

文章目录

  • 题目描述
  • 解析
  • 代码

题目描述

在这里插入图片描述

解析

利用倍增,设计dp慢慢敲即可。。。
注意距离累加在一起会爆int,需要ll
特判条件非常之复杂。。。
心力交瘁,就酱了

代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
typedef pair<ll,ll> pr;
const int N = 3e5 + 100;
int n,m;
struct node{int id,h;bool operator < (const node y)const{return h<y.h;}
}p[N];
int pos[N];
int l[N],r[N],h[N];
bool ok(int x){return x>=1&&x<=n;}
ll jl(int x,int y){return abs(p[x].h-p[y].h);}
struct node2{ll dist,id;bool operator < (const node2 y)const{if(dist!=y.dist) return dist<y.dist;else return h[id]<h[y.id];}
};
node2 fir[N],sec[N];
void del(int x){r[l[x]]=r[x];l[r[x]]=l[x];return;
}
int pl[N][30];
ll dis[3][N][30];
int x0;
void solve(){sort(p+1,p+1+n);for(int i=1;i<=n;i++) pos[p[i].id]=i;for(int i=1;i<=n;i++){l[i]=i-1;r[i]=i+1;}r[0]=1;l[n+1]=n;for(int i=1;i<=n;i++){int pl=pos[i];int l1=0,l2=0,r1=0,r2=0;int num=0;node2 coi[5];if(ok(l[pl])) l1=l[pl],coi[++num]=(node2){jl(pl,l1),p[l1].id};if(l1&&ok(l[l1])) l2=l[l1],coi[++num]=(node2){jl(pl,l2),p[l2].id};if(ok(r[pl])) r1=r[pl],coi[++num]=(node2){jl(pl,r1),p[r1].id};if(r1&&ok(r[r1])) r2=r[r1],coi[++num]=(node2){jl(pl,r2),p[r2].id};sort(coi+1,coi+1+num);if(num>=1) fir[i]=coi[1];if(num>=2) sec[i]=coi[2];del(pl);//printf("i=%d fir=%d sec=%d\n",i,fir[i].id,sec[i].id);}for(int i=1;i<=n;i++){if(sec[i].id) pl[i][0]=sec[i].id;else pl[i][0]=i;}for(int i=1;i<=n;i++){if(pl[i][0]!=i&&fir[pl[i][0]].id) pl[i][1]=fir[pl[i][0]].id;else pl[i][1]=pl[i][0];}for(int i=1;i<=n;i++){if(sec[i].id) dis[1][i][0]=sec[i].dist;else dis[1][i][0]=0;dis[2][i][0]=0;}for(int i=1;i<=n;i++){dis[1][i][1]=dis[1][i][0];if(pl[i][0]!=i&&fir[pl[i][0]].id)dis[2][i][1]=fir[pl[i][0]].dist;else dis[2][i][1]=0;}for(int k=2;(1<<k)<=n;k++){for(int i=1;i<=n;i++){pl[i][k]=pl[pl[i][k-1]][k-1];dis[1][i][k]=dis[1][i][k-1]+dis[1][pl[i][k-1]][k-1];dis[2][i][k]=dis[2][i][k-1]+dis[2][pl[i][k-1]][k-1];}}
}
pair<ll,ll> find(int st,int x){
//	printf("ask: st=%d x=%d\n",st,x);ll disa=0,disb=0,tot=0;int ppl=st;for(int k=20;k>=0;k--){if((1<<k)>n) continue;ll suma=dis[1][ppl][k],sumb=dis[2][ppl][k];if(suma+sumb+tot>x) continue;tot+=suma+sumb;disa+=suma;disb+=sumb;ppl=pl[ppl][k];}
//	printf("  pl=%d disa=%d disb=%d\n",ppl,disa,disb);return make_pair(disa,disb);
}
void test(){for(int k=0;k<=3;k++){for(int i=1;i<=n;i++){printf("i=%d k=%d pl=%d dis1=%d dis2=%d\n",i,k,pl[i][k],dis[1][i][k],dis[2][i][k]);}}return ;
}
int main() {scanf("%lld",&n);for(int i=1;i<=n;i++){scanf("%lld",&p[i].h);h[i]=p[i].h;p[i].id=i;}solve();//test();scanf("%lld",&x0);double mn=2e16,temp;int anspl;for(int i=1;i<=n;i++){pr o=find(i,x0);//printf("st=%d disa=%d disb=%d\n",i,o.first,o.second);temp= o.second==0?2e15:1.0*o.first/o.second;if(temp<mn){mn=temp;anspl=i;}else if(temp==mn&&p[pos[anspl]].h<p[pos[i]].h) anspl=i;}printf("%lld\n",anspl);scanf("%lld",&m);int s,x;for(int i=1;i<=m;i++){scanf("%d%d",&s,&x);pr o=find(s,x);printf("%lld %lld\n",o.first,o.second);}return 0;
}
/*
10 
4 5 6 1 2 3 7 8 9 10 
7 
10 
1 7 
2 7 
3 7 
4 7 
5 7 
6 7 
7 7 
8 7 
9 7 
10 7
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dotnet core调试docker下生成的dump文件

最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象&#xff0c;有时会突然吃掉几个G,触发监控预警&#xff0c;造成容器重启。分析了各种可能原因&#xff0c;修复了可能发生的内存泄露&#xff0c;经测试本地正常&#xff0c;但是发到预生产还是会有内存暴涨现…

Quadratic Form

Quadratic Form 题意&#xff1a; 一个n * n 的正定矩阵和一个n维的向量b&#xff0c;现在找一个x1&#xff0c;x2&#xff0c;…xn满足以下条件&#xff1a; 求这个式子&#xff0c;最后输出P * Q-1 mod 998244353. 题解&#xff1a; 参考 线性代数学过n阶正定的实矩阵等…

8分钟学会Consul集群搭建及微服务概念

Consul介绍&#xff1a;Consul 是由 HashiCorp 公司推出的开源软件&#xff0c;用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案&#xff0c;Consul 的方案更“一站式”&#xff0c;内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Valu…

最小代价(区间dp)(ybtoj)

文章目录题目描述解析代码题目描述 解析 &#xff08;我觉得&#xff09;很难的dp 思路是真的没有想出来 关键在于dp的设计&#xff1a; dp[l][r]&#xff1a;[l,r]的最小价值 f[l][r][a][b]&#xff1a;把l到r之间除了数值在[a,b]之间的数全部消掉需要的最小价值 &#xff08…

.net core i上 K8S(六).netcore程序的service网络代理模式

正文上一章我们讲了pod的hostip模式&#xff0c;但在生产环境中&#xff0c;我们都是通过service来访问k8s集群的&#xff0c;service有两种模式来暴漏端口&#xff0c;今天我们来分享一下1.clusterIP模式我们在创建service的时候&#xff0c;默认创建的时clusterIP模式&#x…

Jamie and Tree[CF916E]

Jamie and Tree[CF916E] 题意&#xff1a; 有一棵n个点的树&#xff0c;每个节点上有一个权值wi&#xff0c;最开始根为1号点&#xff0e;现在有3种 类型的操作&#xff1a; • 1 root, 表示将根设为root. • 2 u v x, 设u, v的最近公共祖先为p, 将p的子树中的所有点的权值加…

领域驱动设计,让程序员心中有码(三)

“正如西方古典哲学在现代社会逐渐式微&#xff0c;成为少数内心丰满者们填充自己精神世界的宝贵食物&#xff0c;UML也这样&#xff1b;互联网技术飞速发展的今天&#xff0c;各类软件设计思想层出不穷&#xff0c;正是站在UML和其他各种软件基础理论巨人的肩膀上&#xff0c;…

Tavan

Tavan–简单的k进制题 呵呵真的简单 也就是考试没做出来罢了&#xff0c;不慌不慌&#xff0c;奶我一口&#xff0c;还能活 【题目摘要】 题目描述 小 Zeljko 一直在阁楼里读他奶奶的旧信&#xff0c;并且发现了一个长度为 N 的单词。 不幸的是&#xff0c;由于溢出的墨水&…

.NET Core 2.x中使用Named Options处理多个强类型配置实例

来源&#xff1a; Using multiple instances of strongly-typed settings with named options in .NET Core 2.x作者&#xff1a; Andrew Lock译者&#xff1a; Lamond Lu.NET Core从1.0版本开始&#xff0c;就已经开始使用Options模式绑定强类型配置对象。从那时起到现在&…

YBTOJ:魔法数字(数位dp)

文章目录题目描述解析题目描述 解析 迷惑。。。 首先&#xff0c;比较容易想到用二进制状态压缩记录1-9是否在十进制中出现过 然后就是整除的问题 如果记录余数&#xff0c;它的模数又有9个 开九维余数直接爆炸。。。 怎么办嘞&#xff1f; 有一个结论&#xff1a; 若&#xf…

Prosjecni(构造)

Prosjecni 【题目摘要】 描述 Slavko很无聊&#xff0c;所以他把正整数填到N*N的方阵中。 如果他填出来的方阵满足以下条件&#xff0c;他会特别高兴&#xff1a; ●每行中的数字的平均值是一个位于同一行的整数。 ●每列中的数字的平均值是一个位于同一列的整数。 ●表中的所…

撒花!中文翻译仓库链接已加入 ML.NET 官方示例网站首页

从2018年12月02日决定开始做ML.NET 示例中文版https://github.com/feiyun0112/machinelearning-samples.zh-cn&#xff0c;然后以每天一篇的速度进行翻译&#xff0c;总共耗时15天&#xff0c;将现有的官方实例全部翻译成了中文&#xff0c;并提交了添加中文链接PR&#xff0c;…

P3803 【模板】多项式乘法(FFT)

P3803 【模板】多项式乘法&#xff08;FFT&#xff09; 题目描述 给定一个 n 次多项式 F(x)&#xff0c;和一个 m 次多项式 G(x)。 请求出 F(x)和 G(x)的卷积。 从低到高输出F(x)*G(x)的系数 另一种问法&#xff1a; 如果有两个无限序列a和b&#xff0c;那么它们卷积的结果是…

YBTOJ:单词频率(AC自动机)

解析 我对力量一无所知 通过这题&#xff0c;可以看出我对AC自动机还是完全没有理解 qwq 首先容易想到&#xff1a; 建一课trie树&#xff0c;然后建树时记录每个串s的终点&#xff0c;这个点后面每被经过一次&#xff0c;就相当于出现一次该单词s 但是&#xff0c;这种“出现”…

一元一次方程

一元一次方程–逆波兰栈 【题目摘要】 题目描述 SLON是一个调皮的学生&#xff0c;为了让他静下心来&#xff0c;老师给他出了一道数学题&#xff1a; 给定表达式A&#xff0c;A中含有变量x和,-,*,(,)这些符号&#xff0c;括号成对出现&#xff0c;一个算术运算符均对应两个操…

.net core上 K8S(七).netcore程序的服务发现

正文上一章我们分享了k8s的网络代理模式&#xff0c;今天我们来分享一下k8s中的服务发现。1.环境变量模式的服务发现k8s默认为我们提供了通过环境变量来实现服务发现的功能&#xff0c;前提是1.需要service在pod之前创建2.适用于同一命名空间1.1创建servicekubectl create -f n…

ASP.NET Core 实战:使用ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目

一、前言这几年前端的发展速度就像坐上了火箭&#xff0c;各种的框架一个接一个的出现&#xff0c;需要学习的东西越来越多&#xff0c;分工也越来越细&#xff0c;作为一个 .NET Web 程序猿&#xff0c;多了解了解行业的发展&#xff0c;让自己扩展出新的技能树&#xff0c;对…

【CF1199 D,E, F】Welfare State // Matching vs Independent Set // Rectangle Painting 1

2019-08-15下午三道练习题CF1199 思路有点难想 but很好实现 这是原网站链接&#xff1a;传送门 这里只完成D, E, F三题 文章目录D&#xff1a;Welfare State题目大意正解瞅瞅代码E:Matching vs Independent Set题目大意正解代码实现F:Rectangle Painting 1题目大意正解代码实现…

YBTOJ:前缀匹配(AC自动机)

文章目录题目描述解析代码题目描述 解析 做的不错 把trie树真的当成一棵树递归即可 注意一个标记时的问题&#xff1a; void AC(){int lstrlen(s01),pl1;for(int i1;i<l;i){int aask(s0[i]);pltr[pl][a];int kpl;while(k>1){if(ok[k]) break;//注意&#xff01;ok[k]1;…

[HAOI2006]均分数据

[HAOI2006]均分数据 题解&#xff1a; 题目稍微解释一下&#xff1a; 把n个数以分为m组&#xff0c;计算每一组的和&#xff0c;求得到的这m个数的方差。由于分法是任意的&#xff0c;我们要求这些方差中的最小值 我们先用STL中的函数random_shuffle()用来对一个元素序列进行…