对于只考虑首位状态的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. idea远程debug(物理机、docker、k8s)

    IDEA远程DEBUG 1:物理机部署的Springboot项目远程DEBUG 1.1:idea配置 点击"Edit Configurations",再点击+,选择Remote, ...

  2. paraview安装

    apt 安装 sudo apt install paraview 安装包安装 参考 https://blog.csdn.net/weixin_47492286/article/details/1272 ...

  3. 3. set 的使用

    3. set 的使用 因为在实际工程中,我们不会将具体文件全部写出来,这是一件费力不讨好的事情. 3.1 set 定义变量 在 CMake 文件中,默认的变量数据类型是字符串,如果要用别的类型,需要进 ...

  4. leetcode简单(数组,字符串,链表):[168, 171, 190, 205, 228, 448, 461, 876, 836, 844]

    目录 168. Excel表列名称 171. Excel 表列序号 190. 颠倒二进制位 205. 同构字符串 228. 汇总区间 448. 找到所有数组中消失的数字 461. 汉明距离 876. ...

  5. 在Django中,多数据操作,你可以编写测试来查询另一个数据库服务器中的数据,并将结果导入当前Django项目的数据库表中

    在Django中,你可以编写测试来查询另一个数据库服务器中的数据,并将结果导入当前Django项目的数据库表中.下面是一个简单的示例: 假设你有一个Django应用程序,名为myapp,并且你希望从另 ...

  6. C#:只支持GET和POST方法的浏览器,如何发送PUT/DELETE请求?RESTful WebAPI如何响应?

    理想的RESTful WebAPI采用面向资源的架构,并使用请求的HTTP方法表示针对目标资源的操作类型.但是理想和现实是有距离的,虽然HTTP协议提供了一系列原生的HTTP方法,但是在具体的网络环境 ...

  7. 关于netty 一些使用细节

    netty 的客户端通常是websoket   但是为了演示也可以用netty做客户端, Channel:可以被理解为数据传输的通道. Pipeline:可以被视为一个由多个工序组成的流水线,负责将数 ...

  8. hbuilderx生成ios证书和上架全教程

    现在很多公司都使用uniapp作为底层框架来开发app应用,而uniapp的开发工具hbuilderx云打包的时候,需要证书和证书profile文件. 假如是ios应用,则还需要上架到appstore ...

  9. keycloak~为微信二维码添加动态kc认可的动态state

    本实例将通过keycloak社区登录实现微信二维码的登录,并且二微码不是keycloak动态生成,而是通过微信提供的js生成的,在页面上直接输出的方式实现的. 动态state 在Keycloak中使用 ...

  10. 测试工程师-生产环境Bug收集表

    1.目的:记录生产环境的故障,有利于分析反推项目或个人的一些不足,从而改进. 2.缺陷分类 用例覆盖不足:  测试用例没有覆盖到(如此类问题居高则需对该测试人员进行严格用例评审): 未测试上线:  开 ...