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

相关文章: