大一寒假,终于有机会开始做自己了。
先把老版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
标签:int,ABC095D,Sushi,sv,P10,ans From: https://www.cnblogs.com/mfc007/p/18673667