斜率優化真的是差的一塌糊塗……這題搞了乙個下午,晚上才清醒點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...