bzoj
luogu
題面不太好簡化就不放了qaq。
先對殭屍的血量做乙個字首和,然後在第\(i\)關中視第\(j\)只殭屍\((j\le i)\)的血量為\(a_i-a_\),這樣就可以當作是開了穿牆掛,可以一直攻擊每乙隻殭屍直至其死亡。
考慮最優策略,一定是某乙隻殭屍在剛好走到門前的時候把他打死。也就是算出打死每乙隻殭屍所需的傷害,放在一起求個\(\max\)。
形式化的,有\(y_i=\max_\}\}\)。感覺這個東西長得很像是個斜率。
所以\(y_i\)就是點\((x_i+di,a_i)\)到所有\((dj,a_)\)的斜率最大值。而斜率最大值一定會出現在下凸殼上(別問我怎麼知道的),所以對所有的\((di,a_)\)維護個下凸殼,然後每次查詢的時候二分即可。
複雜度\(o(n\log n)\)。
#include#includeusing namespace std;
#define ll long long
ll gi()
const int n = 1e5+5;
int n,top;ll d,a[n],x[n];double ans;
struct nodeq[n];
double slope(node p,node q)
int main();
while (top&&slope(q[top-1],q[top])>slope(q[top],tmp)) --top;
q[++top]=tmp;tmp=(node);
int l=1,r=top,res=0;
while (l<=r)
ans+=slope(q[res],tmp);
} printf("%.0lf\n",ans);
return 0;
}
SDOI2013 BZOJ3203 保護出題人
description input 第一行兩個空格隔開的正整數n和d,分別表示關數和相鄰殭屍間的距離。接下來n行每行兩個空格隔開的正整數,第i 1行為ai和 xi,分別表示相比上一關在殭屍佇列排頭增加血量為ai 點的殭屍,排頭殭屍從距離房子xi公尺處開始接近。output 乙個數,n關植物攻擊力的最...
BZOJ 3203 sdoi 2013 保護出題人
由於樣例解釋很清晰,所以很容易得到以下結論 1 每一關都是獨立的,且殭屍的相對位置不會變 2 每一關的攻擊力 max sum i dis i 其實sum i 是殭屍攻擊力的字首和,dis i 是距離 然後因為輸入是每次在隊頭新增,所以我們可以把字首和轉換成字尾和 攻擊力 max sum i sum ...
bzoj 3203 保護出題人
題意 在乙個詭異的植物大戰殭屍遊戲中,給出n關 第i關隊首殭屍距房門xi,兩個殭屍之間間隔為d 每次在隊首新增乙個血量為ai的殭屍,其他殭屍不變 每關在門前放乙個攻擊力任意的植物,求n關放置植物總攻擊力的最小值 n 100000,其他資料 10 12 題解 題意敘述略詭異。建議還是去看一眼原題 首先...