程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> CF 319C(Kalila and Dimna in the Logging Industry-斜率DP,注意叉積LL

CF 319C(Kalila and Dimna in the Logging Industry-斜率DP,注意叉積LL

編輯:C++入門知識

C. Kalila and Dimna in the Logging Industry
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Kalila and Dimna are two jackals living in a huge jungle. One day they decided to join a logging factory in order to make money.

The manager of logging factory wants them to go to the jungle and cut n trees with heights a1, a2, ..., an. They bought a chain saw from a shop. Each time they use the chain saw on the tree number i, they can decrease the height of this tree by one unit. Each time that Kalila and Dimna use the chain saw, they need to recharge it. Cost of charging depends on the id of the trees which have been cut completely (a tree is cut completely if its height equal to 0). If the maximum id of a tree which has been cut completely is i (the tree that have height ai in the beginning), then the cost of charging the chain saw would be bi. If no tree is cut completely, Kalila and Dimna cannot charge the chain saw. The chainsaw is charged in the beginning. We know that for each i < j, ai < aj and bi > bj and also bn = 0and a1 = 1. Kalila and Dimna want to cut all the trees completely, with minimum cost.

They want you to help them! Will you?

Input
The first line of input contains an integer n (1 ≤ n ≤ 105). The second line of input contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109). The third line of input contains n integers b1, b2, ..., bn (0 ≤ bi ≤ 109).

It's guaranteed that a1 = 1, bn = 0, a1 < a2 < ... < an and b1 > b2 > ... > bn.

Output
The only line of output must contain the minimum cost of cutting all the trees completely.

Please, do not write the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64dspecifier.

Sample test(s)
input
5
1 2 3 4 5
5 4 3 2 0
output
25
input
6
1 2 3 10 20 30
6 5 4 3 2 0
output
138

 

 

 


這題就是斜率DP(555...早知道直接做第3題)

方程我就不寫了

long long 溢出我居然De了一上午Bug才發現,我……


[cpp]
#include<cstdio>  
#include<cstdlib>  
#include<cstring>  
#include<iostream>  
#include<algorithm>  
#include<functional>  
#include<cmath>  
#include<cctype>  
using namespace std; 
#define For(i,n) for(int i=1;i<=n;i++)  
#define Rep(i,n) for(int i=0;i<n;i++)  
#define Fork(i,k,n) for(int i=k;i<=n;i++)  
#define ForD(i,n) for(int i=n;i;i--)  
#define Forp(x) for(int p=pre[x];p;p=next[p])  
#define RepD(i,n) for(int i=n;i>=0;i--)  
#define MEM(a) memset(a,0,sizeof(a))  
#define MEMI(a) memset(a,127,sizeof(a))  
#define MEMi(a) memset(a,128,sizeof(a))  
#define MAXN (100000+10)  
#define size (tail-head+1)  
int n; 
long long a[MAXN],b[MAXN],f[MAXN]={0}; 
struct node 

    int i; 
    long long x,y; 
    node(){} 
    node(int _i):i(_i),x(b[i]),y(f[i]){} 
    friend long double k(node a,node b){return (long double)(a.y-b.y)/(long double)(a.x-b.x);   } 
}q[MAXN]; 
int head=1,tail=1; 
struct V 

    long long x,y; 
    V(node a,node b):x(b.x-a.x),y(b.y-a.y){} 
    friend long long operator*(V a,V b){return ((double)a.x/a.y-(double)b.x/b.y)>0?1:-1; } 
}; 
int main() 

//  freopen("CF319C.in","r",stdin);  
//  freopen("CF319C.out","w",stdout);  
     
    cin>>n; 
    For(i,n) cin>>a[i]; 
    For(i,n) cin>>b[i]; 
    f[1]=b[1]; 
    q[1]=node(1); 
    Fork(i,2,n) 
    { 
        while (size>=2&&k(q[head],q[head+1])>1-a[i] ) head++; 
        int j=q[head].i; 
        f[i]=f[j]+(long long)(a[i]-1)*(long long)b[j]+b[i]; 
        while (size>=2&&(V(q[tail-1],q[tail])*V(q[tail],node(i))>0)) tail--; //維護上凸殼   
        q[++tail]=node(i); 
    } 
    //For(i,n) cout<<b[i]<<' ';cout<<endl;  
    //For(i,n) cout<<f[i]<<' ';cout<<endl;  
    cout<<f[n]<<endl; 
     
    return 0; 

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cctype>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define RepD(i,n) for(int i=n;i>=0;i--)
#define MEM(a) memset(a,0,sizeof(a))
#define MEMI(a) memset(a,127,sizeof(a))
#define MEMi(a) memset(a,128,sizeof(a))
#define MAXN (100000+10)
#define size (tail-head+1)
int n;
long long a[MAXN],b[MAXN],f[MAXN]={0};
struct node
{
 int i;
 long long x,y;
 node(){}
 node(int _i):i(_i),x(b[i]),y(f[i]){}
 friend long double k(node a,node b){return (long double)(a.y-b.y)/(long double)(a.x-b.x); }
}q[MAXN];
int head=1,tail=1;
struct V
{
 long long x,y;
 V(node a,node b):x(b.x-a.x),y(b.y-a.y){}
 friend long long operator*(V a,V b){return ((double)a.x/a.y-(double)b.x/b.y)>0?1:-1; }
};
int main()
{
// freopen("CF319C.in","r",stdin);
// freopen("CF319C.out","w",stdout);
 
 cin>>n;
 For(i,n) cin>>a[i];
 For(i,n) cin>>b[i];
 f[1]=b[1];
 q[1]=node(1);
 Fork(i,2,n)
 {
  while (size>=2&&k(q[head],q[head+1])>1-a[i] ) head++;
  int j=q[head].i;
  f[i]=f[j]+(long long)(a[i]-1)*(long long)b[j]+b[i];
  while (size>=2&&(V(q[tail-1],q[tail])*V(q[tail],node(i))>0)) tail--; //維護上凸殼
  q[++tail]=node(i);
 }
 //For(i,n) cout<<b[i]<<' ';cout<<endl;
 //For(i,n) cout<<f[i]<<' ';cout<<endl;
 cout<<f[n]<<endl;
 
 return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved