P10 ABC095D Static Sushi

​ 大一寒假,终于有机会开始做自己了。

​ 先把老版ABC所有题淦了再说!这是第一题。

​ 看一眼就能出思路,很容易往贪心去想,因为可以将路线划分成两部分。毕竟他要么就一直顺时针(这个直接算出即可),要么就绕一半返回去再反向绕。后来我发现第二种情况还有两种情况,因为原路返回的部分要再走一次,这个部分可能是左边也可能是右边,所以在统计时还要分两种情况开两个数组。

const int N=100010;

int n;
ll ans,c,x[N],v[N],sv[N],mx[2][N],mxc[2][N];

signed main(){
  IOS
  cin>>n>>c;
  for(int i=1;i<=n;++i)
    cin>>x[i]>>v[i],sv[i]=sv[i-1]+v[i];
  ans=sv[n]-(c-x[1]);

  for(int i=1;i<=n;++i){
    mx[0][i]=max(mx[0][i-1],sv[i]-x[i]);
    mxc[0][i]=max(mxc[0][i-1],(sv[n]-sv[n-i])-(c-x[n-i+1]));
    mx[1][i]=max(mx[1][i-1],sv[i]-(x[i]<<1));
    mxc[1][i]=max(mxc[1][i-1],(sv[n]-sv[n-i])-((c-x[n-i+1])<<1));
  }
  
  for(int i=1;i<=n;++i){
    ll res=max(mx[0][i]+mxc[1][n-i],mx[1][i]+mxc[0][n-i]);
    ans=max(ans,res);
  } cout<<ans<<'\n';

  return 0;
}

· EOF

posted @ 2025-01-15 20:09  ComplexityMFC  阅读(42)  评论(0)    收藏  举报