为什么是负数
查看原帖
为什么是负数
414369
Moonlit楼主2021/5/30 14:30
#include<iostream>
using namespace std;
const long long maxn = 50002;
long long que[maxn] , s[maxn] , f[maxn];
int n , l , qian = 1 , hou = 0;
long long K(int wz){
    return 2 * (s[wz] - l);
}
long long Y(int wz){
    return s[wz] ^ 2;
}
long long X(int wz){
    return s[wz];
}
bool xl(int i){
    long long x1 = X(que[qian]) , y1 = Y(que[qian]);
    long long x2 = X(que[qian + 1]) , y2= Y(que[qian + 1]);
    return (y2 - y1) < K(i) * (x2 - x1);
}
bool xll(int i){
    long long x1 = X(que[hou]) , y1 = Y(que[hou]);
    long long x2 = X(i) , y2 = Y(i);
    long long x3 = X(que[hou - 1]) , y3 = Y(que[hou - 1]);
    return (y2 - y3) * (x1 - x3) > (x2 - x3) * (y1 - y3);
}
int main(){
    cin >> n >> l;
    l --;
    for (int i = 1 ; i <= n ; i ++){
        cin >> s[i];
        s[i] = s[i - 1] + s[i] + 1;
    }
    que[++hou] = 0;
    for (int i = 1 ; i <= n ; i ++){
        while(qian < hou && xl(i)) ++ qian;
        f[i] = f[que[qian]] + (s[i] - l) ^ 2 + s[que[qian]] ^ 2 - 2 * (s[que[qian]] - l) * s[que[qian]];
        while(qian < hou && xll(i)) -- hou;
        que[++hou] = i;
    }
    cout << f[n] << endl;
    return 0;
}
2021/5/30 14:30
加载中...