5380 Function 斜率優化

2021-08-24 18:12:33 字數 2012 閱讀 5957

斜率優化真的是差的一塌糊塗……這題搞了乙個下午,晚上才清醒點ac了。

題目顯然就是求從

y y

位置開始往右走,中途每走到乙個格仔可以至少獲得一次它的權值,獲得

x' role="presentation" style="position: relative;">x

x次權值的最小值。那麼策略顯然就是走到乙個比較優秀的格仔停下來,假設走到

i i

停下來,那麼v=

sumy

−sum

i+ai

×i+a

i×(x

−y)' role="presentation" style="position: relative;">v=s

umy−

sumi

+ai×

i+ai

×(x−

y)v=

sumy

−sum

i+ai

×i+a

i×(x

−y),移項得ai

×(y−

x)+v

=sum

y−su

mi+a

i×i ai×

(y−x

)+v=

sumy

−sum

i+ai

×i

,那麼這個顯然是可以斜率優化的,因為要令截距

v v

最小,所以維護乙個下凸包,但是有個問題,這些點的橫座標不是單調的,不過我們發現,如果前面的ai

' role="presentation" style="position: relative;">aia

i比後面的aj

a

j大,那麼ai

a

i是沒用的,利用這個可以使點的橫座標單調。求答案的時候由於給出的斜率不單調,所以要在凸包上二分求解。注意求解時並非整個凸包上的點都是可以用的,因為從

y y

開始最多只能走

x' role="presentation" style="position: relative;">x

x步,可以二分出合法左端點。

#include

using

namespace

std;

#define ll long long

#define pa pair

const

int maxn=500010;

const

int inf=2147483647;

int read()

while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

return x*f;

}int n,q,a[maxn],sta[maxn],top=0;

ll sum[maxn],ans[maxn],b[maxn];

struct queryq[maxn];

bool cmp(query a,query b)

int binary_search(int pos)

return r+1;

}int main()

q=read();

for(int i=1;i<=q;i++)q[i].x=read(),q[i].y=read(),q[i].id=i;

sort(q+1,q+1+q,cmp);

int now=0;

for(int i=1;i<=q;i++)

int l=binary_search(q[i].y-q[i].x+1)+1,r=top;

int k=q[i].y-q[i].x;

while(l<=r)

l--;

ans[q[i].id]=sum[q[i].y]-sum[sta[l]]+(ll)a[sta[l]]*(q[i].x-q[i].y+sta[l]);

}for(int i=1;i<=q;i++)printf("%lld\n",ans[i]);

}

fun和fun 的區別,函式也是物件

定義函式的3種方式 1 不常用 var fun new function console.log hello 這是我的第乙個函式 2 使用函式宣告 function 函式名 形參1,形參2.形參n 3 使用函式表示式 var 函式名 function 形參1,形參2.形參n 除5種基本型別以外的其他...

fun2比fun1稍快點

fun2比fun1稍快點 執行環境 winxp vs2005 vc8 核心 include using namespace std include define wan 10000 const int inum wan wan 3 void fun1 int p void fun2 int p 測試...

雙下劃線 fun

雙下劃線表示私有 private 型別的成員。只允許定義該方法的類在類內部進行訪同,不能 通過類的例項進行訪問,但是可以通過 類的例項名類名 方式進行訪問。例7.13建立乙個geese類,定義私有屬性neck,並在 init o方法中訪問該屬性,最後生成geese的例項,通過例項名輸出私有屬性 ne...