昨天晚上写的时候看错题了,以为并不是交替走,最后没时间了读了一遍题目发现是交替走,然后就秒了但是已经没时间写了。
其实昨天并不想写,不过看了下D题发现是个数学题,虽然我数学题非常渣渣,但是拿起笔就推了推式子,发现可做,写完代码后第一次交RE,数组开小了,第二次交Wa,很奇怪,最后发现预处理应该是2×1062×10^62×106,非常蛋疼~
C. Minimum Grid Path
预处理前缀和以及前缀最小值,由于是交替走,只有两种情况:两个方向都走kkk次,或者一个方向走k+1k+1k+1次一个方向走kkk次,枚举kkk计算即可。
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
using ll=long long;
constexpr int N=200010;
int n;
ll c[N];
ll a[N],b[N];
ll sa[N],sb[N];
ll ma[N],mb[N];
int cnta,cntb;
ll calc(int k)
{ll res=1e18;res=min(res,sa[k]+ma[k]*(n-k)+sb[k]+mb[k]*(n-k));if(k+1<=cnta) res=min(res,sa[k+1]+ma[k+1]*(n-k-1)+sb[k]+mb[k]*(n-k));return res;
}
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int T=1;cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>c[i];cnta=cntb=0;for(int i=1;i<=n;i+=2) a[++cnta]=c[i];for(int i=2;i<=n;i+=2) b[++cntb]=c[i];sa[0]=sb[0]=0;for(int i=1;i<=cnta;i++) sa[i]=sa[i-1]+a[i];for(int i=1;i<=cntb;i++) sb[i]=sb[i-1]+b[i];ma[0]=mb[0]=1e18;for(int i=1;i<=cnta;i++) ma[i]=min(ma[i-1],a[i]);for(int i=1;i<=cntb;i++) mb[i]=min(mb[i-1],b[i]);ll res=1e18;for(int i=1;i<=min(cnta,cntb);i++) res=min(res,calc(i));cout<<res<<'\n';}return 0;
}