对于只考虑首位状态的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 }