ÌâÒ⣺¸ø³öÁ½¸öÊý×飬·Ö±ð±íʾÊ÷µÄ¸ß¶ÈºÍÊ÷µÄ²¹³äÄÜÁ¿µÄÖµ¡£ÓÐÁ½¸öÈËÔÚ¾âÊ÷£¬ÕâÁ½¸öÈ˵ľâ×ÓºÜÉñÆæ£¬Ò»´ÎÖ»ÄܾâÒ»¿ÅÊ÷µÄ¸ß¶È1,Ò²¾ÍÊÇÒ»´ÎÒ»¿ÅÊ÷Ö»¼õ1.È»ºóÿ´Î¾â×Ó¾âÍêÒ»´Î¾ÍÒª²¹³äÒ»ÏÂÄÜÁ¿£¬Õâ¸ö²¹³äµÄÄÜÁ¿Ã¿´Î¾ÍÊÇÕÒµ½±»¾âÍêµÄID×î´óµÄÊ÷£¬È»ºó²¹³äÕâ¸öÊ÷µÄÄÜÁ¿Öµ¡£×îºó¾ÍÊÇÎÊ£¬×îÉÙÐèÒª»¨·Ñ¶àÉÙµÄÄÜÁ¿£¬²ÅÄÜʹµÃËùÓеÄÊ÷¶¼±»¾âÍê¡£ ·ÖÎö£ºÏÔÈ»ÊǸöDP.¿¼Âǵ½N = 10 ^ 5,ÄÇô¶þÖØDP¿Ï¶¨ÊDz»¿ÉÒԵġ£ÎÒÃǼÙÉèdp[i]ÊǵÚi¿ÃÊ÷±»¾âÍêµÄ×Ü»¨·Ñ£¬ÄÇôdp[i] = min£¨dp[i] , dp[j] + a[i] * b[j]£©¡£ ÕâÀïiÐèÒªÒ»ÖØÑ»·£¬jÐèÒªÒ»ÖØÑ»·£¬ËùÒԿ϶¨TLE. ¿¼Âǵ½ºóÃæµÄϵÊý£¬ÎÒÃÇÏÔÈ»¿ÉÒÔʹÓÃбÂÊÓÅ»¯À´ÓÅ»¯Õâ¸öÎÊÌâ¡£ dp[j] + a[i] * b[j] < dp[k] + a[i] * b[k]. => £¨dp[j] - dp[k]£© / £¨b[k] - b[j]£© < a[i] . ËùÒÔбÂʾͳöÀ´ÁË¡£¾Í¿ÉÒÔÓÅ»¯ÁË¡£ ÕâÌâÐèҪעÒâһϵľÍÊÇ£¬ÒÔǰÎÒдбÂÊÓÅ»¯Ò»°ã¶¼ÊÇÒ»¸ö·Ö×Ó£¬Ò»¸ö·Öĸ£¬È»ºóÓÅ»¯µÄʱºòÁ½±ßÏà³ËÅжϡ£ µ«ÊÇÕâÌâÐèҪעÒâµÄ¾ÍÊÇ£¬µ±Ïà³ËµÄʱºò£¬ÊÇÓпÉÄܱ¬long long µÄ ËùÒÔ¸ÄÓÃdouble¾Í¹ýÁË£¬ÕâºÍƽʱµÄд·¨Óйأ¬µ±È»Ò²ÐèÒª¸ü¼ÓϸÐÄ¡£ #include <set> #include <map> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <string> #include <vector> #include <iomanip> #include <cstring> #include <iostream> #include <algorithm> #define Max 2505 #define FI first #define SE second #define ll unsigned __int64 #define PI acos£¨-1.0£© #define inf 0x3fffffff #define LL£¨x£© £¨ x ¡¶ 1 £© #define bug puts£¨"here"£© #define PII pair<int,int> #define RR£¨x£© £¨ x ¡¶ 1 | 1 £© #define mp£¨a,b£© make_pair£¨a,b£© #define mem£¨a,b£© memset£¨a,b,sizeof£¨a£©£© #define REP£¨i,s,t£© for£¨ int i = £¨ s £© ; i <= £¨ t £© ; ++ i £© using namespace std; #define N 1111111 ll a[N] ; ll b[N] ; ll dp[N] ; int qe[N] ; ll getU£¨int j ,int k£©{//·Ö×Ó return dp[j] - dp[k] ; } ll getD£¨int j ,int k£©{//·Öĸ return b[k] - b[j] ; } double fk£¨int j ,int k£©{ return £¨double£©£¨dp[j] - dp[k]£© / £¨b[k] - b[j]£© ; } ll getDP£¨int i ,int j£©{ return dp[j] + b[j] * a[i] ; } int main£¨£© { int n ; cin ¡· n ; for £¨int i = 1 ; i <= n ; i ++ £©cin ¡· a[i] ; for £¨int i = 1 ; i <= n ; i ++ £©cin ¡· b[i] ; mem£¨dp , -1£© ; int l = 0 , r = 0 ; qe[r ++ ] = 1 ; // dp[0] = 0 ; dp = 0 ; for £¨int i = 2 ; i <= n ; i ++ £©{ while£¨l + 1 < r && fk£¨qe[l + 1] , qe[l]£© <= a[i]£© l ++ ; dp[i] = getDP£¨i , qe[l]£© ; //ÕâÀïÁ½Ê½Ïà³ËÊDZ¬long long µÄ¡£×¢Òâһϡ£ // while£¨l + 1 < r && getU£¨i , qe[r - 1]£© * getD£¨qe[r - 1] ,qe[r - 2]£© <= // getU£¨qe[r - 1] , qe[r - 2]£© * getD£¨i , qe[r - 1]£©£© r -- ; while£¨l + 1 < r && fk£¨i , qe[r - 1]£© <= fk£¨qe[r - 1] , qe[r - 2]£©£© r -- ; qe[r ++ ] = i ; } cout ¡¶ dp[n] ¡¶ endl ; return 0 ; } |