BZOJ3203 SDOI2013 保護出題人

2022-04-28 20:18:09 字數 912 閱讀 5853

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 題解 題意敘述略詭異。建議還是去看一眼原題 首先...