hdu6546 Function

2613 단어

Function


\(\text{Alice}\)\(n\)개의 2차 함수가 있습니다\(F_i(x)=a_ix^2+b_ix+c_i(i\in [1,n])\). 현재 그는\(\sum_{i=1}^{n}{x_i=m}\)와\(x\)가 정수인 조건에서\(\sum_{i=1}^n{F_i(x_i)}\)의 최소값을 구하려고 합니다.이 최소값을 요청합니다.

Input


첫 번째 줄에 두 개의 정수\(n, m.\) 아래의\(n\) 줄, 줄마다 세 개의 정수\(a, b, c,\)는 각각 2차 함수의 2차 항, 1차 항, 상수 항 계수를 대표한다.

Output


한 줄에 한 정수씩 답을 표시한다.

Sample Input


2 3 1 1 1 2 2 2

Sample Output


십삼

Data range


모든 테스트 데이터 충족:
  • \(a_i\in[1,10^3]\)
  • \(b_i,c_i\in[-10^3,10^3]\)
  • \(n\leq m\)

  • 테스트 포인트 번호
    \(m\) 1 ~ 2
    \(\leqslant 10\) 3 ~ 4
    \(\leqslant 100\) 5 ~ 6
    \(\leqslant 500\) 7 ~ 10
    \(\leqslant 5\times 10^3\) 11 ~ 20
    \(\leqslant 10^5\)
    사고방식: 각 함수의\(x\)를\(1\)로 지정하고\(f_i(x_i+1)-f_i(x_i)\)와\(i\)가 우선 순위 대기열에 저장되고\(\Delta f_i\)를 눌러\(x_i+1\) 작업을\(,\) 한 다음\(f_i(x_i+1)-f_i (x_i)\) 와\(i\) 우선 순위 대기열 다시 넣기\(,\) 반복\(m-n\) 회
    증명:\(\because f^{'}_i(x)=2a_i+b_i\And a_i\geq 1\)\(\therefore\Delta f_i\)\(x_i+1\)작업과 함께 단조로워지고\(\because\)\(\sum_{i=1}^nf_i(x_i)\)최소\(\therefore\)최소\(\Delta f_i\)\(x_i+1\)작업을 수행해야 합니다.
    \(\mathfrak{Talk\is\cheap,show\you\the\code.}\)
    #include
    #include
    #include
    #include
    #include
    using namespace std;
    # define Type template
    # define read read1()
    Type inline T read1()
    {
        T t=0;
        char k;
        bool fl=0;
        do k=getchar(),(k=='-')&&(fl=1);while('0'>k||k>'9');
        while('0'<=k&&k<='9')t=(t<<3)+(t<<1)+(k^'0'),k=getchar();
        return fl?-t:t;
    }
    # define A pair
    # define ll long long
    priority_queue,greater>q;
    int s,nx[100001],m;
    ll a[100001],b[100001],c[100001],ans;
    ll f(ll x,int n){return a[n]*x*x+b[n]*x+c[n];}
    int main()
    {
    freopen("function.in","r",stdin);
    freopen("function.out","w",stdout);
    s=read;m=read-s;
    for(int i=0;i++^s;nx[i]=1)
    {
    a[i]=read,b[i]=read,c[i]=read;
    q.push(A(f(2,i)-f(1,i),i));
    ans+=f(1,i);
    }
    while(m--)
    {
    A tem=q.top();
    q.pop();
    ans+=tem.first;
    ++nx[tem.second];
    tem.first=f(nx[tem.second]+1,tem.second)-f(nx[tem.second],tem.second);
    q.push(tem);
    }
    printf("%lld",ans);
    return 0;
    }

    좋은 웹페이지 즐겨찾기