对于只考虑首位状态的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. Nginx配置文件nginx.conf中location的匹配原则

    一.空格:默认匹配.普通匹配 location / { root /home; } 二.= :精确匹配(表示匹配到  /home/resources/img/face.png 这张图片) locati ...

  2. 使用AWS Glue进行 ETL 工作

    数据湖 数据湖的产生是为了存储各种各样原始数据的大型仓库.这些数据根据需求,进行存取.处理.分析等.对于存储部分来说,开源版本常见的就是 hdfs.而各大云厂商也提供了各自的存储服务,如 Amazon ...

  3. 高通Android UEFI中的LCD分析(2):关键的函数

    # 高通Android UEFI中的LCD分析(2):关键的函数 背景 在启动流程分析中,看到了几个经常出现的函数,这里实际分析一下有关的实现.以搞清楚高通做了什么,以及我们能做什么. 重要函数 MD ...

  4. FreeRtos学习总结

    背景 最近项目需要,花了几天时间学习了FreeRTOS,因为之前有操作系统和底层的基础,所以上手非常快. 正文 基础篇 学习方法:建议先阅读本人整理的文章:再结合FreeRTOS文档官方的全英文档&l ...

  5. k8s livenessprobe和readinessprobe详解

    一.为什么需要容器探针 如何保持Pod健康 只要将pod调度到某个节点,Kubelet就会运行pod的容器,如果该pod的容器有一个或者所有的都终止运行(容器的主进程崩溃),Kubelet将重启容器, ...

  6. 微信小程序广告自动访问:让广告收益轻松翻倍的利器

    微信小程序流量主挂机刷广告脚本/机器人/助手 在当下这个数字化飞速发展的时代,微信小程序已经成为商家推广和吸引流量的重要平台.然而,对于很多小程序流量主来说,如何最大化地利用广告资源.提升广告收益,却 ...

  7. Mac VMware Fusion 11.5 虚拟机带密钥

    虚拟机 链接: https://pan.baidu.com/s/19V20p5ZV-1U5lFNHrotLgw 密码: rdun CentOS 6.5 链接: https://pan.baidu.co ...

  8. 在audio DSP中如何做软件固化

    在audio DSP中, 软件的code和data主要放在3种不同的memory上,分别是片内的ITCM.DTCM和片外的memory(比如DDR)上.ITCM只能放code,DTCM只能放data, ...

  9. Mysql实现主从复制(一主双从)

    一.环境介绍 LNMP(centos7,mysql5.6) vmware workstation pro配置了3个虚拟机,均安装了LNMP环境: master:  192.168.0.105 slav ...

  10. django如何将查询结果的栏位和数值自动遍历出来

    在Django中,MT003HModel.objects.all() 返回的是一个 QuerySet 对象,你可以使用迭代器来遍历其中的每个对象,然后访问对象的属性来获取栏位和数值. 以下是一个简单的 ...