对于只考虑首位状态的DP,考虑用倍增优化

P1081 开车旅行

https://www.luogu.org/problemnew/show/P1081

 1 const int N=100005;
2 struct node{int x,y;};
3 il bool operator <(node a,node b){return a.y<b.y;}
4 typedef set<node> st;
5 typedef st::iterator itr;
6 st s;itr it,lt,rt;
7 int ii,ga[N],gb[N],t,f[18][N][2],g[10],m,h[N],n,ans;
8 ll ansA,ansB,a[18][N][2],b[18][N][2],A,B;
9
10 il bool cmp(int a,int b)
11 {
12 return abs(h[a]-h[ii]) < abs(h[b]-h[ii]) || (abs(h[a]-h[ii]) == abs(h[b]-h[ii]) && h[a]<h[b]);
13 }
14
15 il void pre()
16 {
17 n=rd();
18 FOR(i,1,n) h[i]=rd();
19 for(ii=n;ii;--ii)
20 {
21 node p=(node){ii,h[ii]};
22 s.insert(p);
23 it=s.find(p);
24 lt=it,rt=it,m=0;
25 if(lt!=s.begin()) lt--,g[++m]=lt->x;
26 if(lt!=s.begin()) lt--,g[++m]=lt->x;
27 if(rt++,rt!=s.end())
28 {
29 g[++m]=rt->x;
30 if(rt++,rt!=s.end()) g[++m]=rt->x;
31 }
32 sort(g+1,g+m+1,cmp);
33 if(m) gb[ii]=g[1];
34 if(m>1) ga[ii]=g[2];
35 }
36 }
 1 il void work()
2 {
3 FOR(i,1,n)
4 {
5 if(ga[i]) f[0][i][0]=ga[i],a[0][i][0]=abs(h[ga[i]]-h[i]);
6 if(gb[i]) f[0][i][1]=gb[i],b[0][i][1]=abs(h[gb[i]]-h[i]);
7 }
8 t=(int)(log(n*1.0)/log(2.0)+0.001);
9 FOR(i,1,t) FOR(j,1,n) FOR(k,0,1)
10 {
11 int l;
12 if(i==1) l=k^1; else l=k;
13 if(f[i-1][j][k]) f[i][j][k]=f[i-1][f[i-1][j][k]][l];
14 if(f[i][j][k])
15 {
16 a[i][j][k]=a[i-1][j][k]+a[i-1][f[i-1][j][k]][l];
17 b[i][j][k]=b[i-1][j][k]+b[i-1][f[i-1][j][k]][l];
18 }
19 }
20 }
 1 il void solve(int s,int x0,ll &A,ll &B)
2 {
3 A=B=0;int k=0;
4 For(i,t,0)
5 if(f[i][s][k]&&a[i][s][k]+b[i][s][k]<=x0)
6 {
7 x0-=a[i][s][k]+b[i][s][k];
8 A+=a[i][s][k],B+=b[i][s][k];
9 if(i==0) k^=1;
10 s=f[i][s][k];
11 }
12 }
13
14 il void print()
15 {
16 int x0=rd();
17 ansA=1,ansB=0;
18 FOR(i,1,n)
19 {
20 solve(i,x0,A,B);
21 if(!B) A=1;
22 if(A*ansB < B*ansA || (A*ansB==B*ansA && h[i]>h[ans])) ansA=A,ansB=B,ans=i;
23 }
24 printf("%d\n",ans);
25 m=rd();
26 FOR(i,1,m)
27 {
28 int x=rd(),y=rd();
29 solve(x,y,A,B);
30 printf("%lld %lld\n",A,B);
31 }
32 }
33
34 int main()
35 {
36 pre();
37 work();
38 print();
39 return 0;
40 }

倍增优化DP的更多相关文章

  1. HZOJ 20190727 随(倍增优化dp)

    达哥T1 实际上还是挺难的,考试时只qj20pts,还qj失败 因为他专门给出了mod的范围,所以我们考虑把mod加入时间复杂度. $50\%$算法: 考虑最暴力的dp,设$f[i][j]$表示进行$ ...

  2. $Noip2012\ Luogu1081$ 开车旅行 倍增优化$ DP$

    Luogu Description Sol 1.发现对于每个城市,小A和小B的选择是固定的,可以预处理出来,分别记为ga[],gb[] 2.并且,只要知道了出发城市和出发天数,那么当前城市和小A,小B ...

  3. CodeForces - 1175E Minimal Segment Cover (倍增优化dp)

    题意:给你n条线段[l,r]以及m组询问,每组询问给出一组[l,r],问至少需要取多少个线段可以覆盖[l,r]区间中所有的点. 如果贪心地做的话,可以求出“从每个左端点l出发选一条线段可以到达的最右端 ...

  4. $CH0601\ Genius\ ACM$ 倍增优化DP

    ACWing Description 给定一个长度为N的数列A以及一个整数T.我们要把A分成若干段,使得每一段的'校验值'都不超过N.求最少需要分成几段. Sol 首先是校验值的求法: 要使得'每对数 ...

  5. 0x57 倍增优化DP

    真的是下定了巨大的决心来搞这一讲,果不其然耗了一晚上 开车旅行(真的是NOIP的题吗怎么这么恐怖) 首先,先用set把小A和小B从城市i出发,到达的下一个城市预处理出来. f[i][j][k]表示走了 ...

  6. POJ 1014 Dividing(多重背包, 倍增优化)

    Q: 倍增优化后, 还是有重复的元素, 怎么办 A: 假定重复的元素比较少, 不用考虑 Description Marsha and Bill own a collection of marbles. ...

  7. Codeforces 356D 倍增优化背包

    题目链接:http://codeforces.com/contest/356/problem/D 思路(官方题解):http://codeforces.com/blog/entry/9210 此题需要 ...

  8. 矩阵乘法优化DP复习

    前言 最近做毒瘤做多了--联赛难度的东西也该复习复习了. Warning:本文较长,难度分界线在"中场休息"部分,如果只想看普及难度的可以从第五部分直接到注意事项qwq 文中用(比 ...

  9. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  10. bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

    题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...

随机推荐

  1. 算法金 | 没有思考过 Embedding,不足以谈 AI

    大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 在当今的人工智能(AI)领域,Embedding 是一个不可或缺的概念 ...

  2. RPC和心跳机制

    hadoop在节点间的内部通讯使用的是RPC,RPC协议把消息翻译成二进制字节流发送到远程节点,远程节点再通过反序列化把二进制流转成原始的信息. namenode与datanode之间的通信,jobt ...

  3. Linux服务器从头配置

    安装配置jdk 下载 jdk jdk-8u171-linux-x64.tar.gz 将该压缩包放到/usr/local/jdk目录下然后解压(jdk目录需要自己手动创建) tar zxvf jdk-8 ...

  4. 2. CMake 的简单使用

    2. CMake 的简单使用 我们创建一个工程目录,在里面定义一些简单的加减乘除运算,然后定义一个 main.cpp 的文件: 结构如下: tree /f .\ D:\SOURCE\CMAKE_PRO ...

  5. Java JVM——12. 垃圾回收理论概述

    1.前言 1.1 什么是垃圾? 在提到什么是垃圾之前,我们先看下面一张图: 从上图我们可以很明确的知道,Java 和 C++ 语言的区别,就在于垃圾收集技术和内存动态分配上,C++ 语言没有垃圾收集技 ...

  6. .NET科普:.NET简史、.NET Standard以及C#和.NET Framework之间的关系

    最近在不少自媒体上看到有关.NET与C#的资讯与评价,感觉大家对.NET与C#还是不太了解,尤其是对2016年6月发布的跨平台.NET Core 1.0,更是知之甚少.在考虑一番之后,还是决定写点东西 ...

  7. Kubernetes 存储概念之Volumes介绍

    Volumes 默认情况下容器中的磁盘文件是非持久化的,对于运行在容器中的应用来说面临两个问题,第一:当容器挂掉,K8S重启它时,文件将会丢失:第二:当Pod中同时运行多个容器,容器之间需要共享文件时 ...

  8. java+mysql+tomcat环境变量配置(windows版)

    jdk8(本人用的jdk8) 系统变量->新建:{JAVA_HOME=[JDK安装目录]} 系统变量->PATH:头部追加%JAVA_HOME%\bin;%JAVA_HOME%\jre\b ...

  9. Rust 中 *、&、mut、&mut、ref、ref mut 的用法和区别

    Rust 中 *.&.mut.&mut.ref.ref mut 的用法和区别 在 Rust 中,*.ref.mut.& 和 ref mut 是用于处理引用.解引用和可变性的关键 ...

  10. java面试一日一题:mysql执行delete数据真的被删除了吗

    问题:请讲下mysql执行了delete操作,数据真的被删除了吗 分析:这个问题考察对mysql底层存储的理解. 回答要点: 主要从以下几点去考虑, 1.肯定没有真正删除? 2.为什么这样设计? my ...