Cod sursa(job #2690353)

Utilizator cadmium_Voicu Mihai Valeriu cadmium_ Data 23 decembrie 2020 17:28:51
Problema Euro Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#define int long long
using namespace std;
ifstream cin("euro.in");
ofstream cout("euro.out");
struct line {
  int m, b;
  int apply(int x) {
    return m*x+b;
  }
};
static inline line makeline(int slope, int collateral) {
  line rez;
  rez.m=slope;
  rez.b=collateral;
  return rez;
}
class lichao {
  public: 
    line tree[131072];
    void insert(int node, int cl, int cr, line val) {
      int mid=(cl+cr)/2;
      bool leftlow=(val.apply(cl)>tree[node].apply(cl));
      bool midlow=(val.apply(mid)>tree[node].apply(mid));
      if(midlow) {
          swap(tree[node],val);
          leftlow=!leftlow;
      }
      if(cl<cr) {
        if(leftlow) {
          insert(2*node,cl,mid,val);
        }
        else {
          insert(2*node+1,mid+1,cr,val);
        }
      }
      return;
    }
    int query(int node, int cl, int cr, int val) {
      int recval,mid=(cl+cr)/2;
      if(cl==cr)
        return tree[node].apply(val);
      if(val<=mid) {
        recval=query(2*node,cl,mid,val);
      }
      else
        recval=query(2*node+1,mid+1,cr,val);
      return max(recval,tree[node].apply(val));
    }
}tree;
signed main() {
  int n,k,sum=0,x,rez=0;
  cin >> n >> k;
  for(int i=1; i<=n; i++) {
    cin >> x;
    sum+=x;
    rez=sum*i-k+tree.query(1,1,n,i);
    tree.insert(1,1,n,makeline(-sum,rez));
  }
  cout << rez << '\n';
}