出題人銘銘認為給sdoi2012 出題太可怕了,因為總要被罵,於是他又給sdoi2013 出題了。
參加sdoi2012 的小朋友們釋放出大量的殭屍,企圖攻擊銘銘的家。而你作為sdoi2013的參賽者,你需要保護出題人銘銘。
殭屍從唯一一條筆直道路接近,你們需要在銘銘的房門前放置植物攻擊殭屍,避免殭屍碰到房子。第一關,乙隻血量為a1 點的殭屍從距離房子x1 公尺處勻速接近,你們放置了攻擊力為y1 點/秒的植物進行防禦;第二關,在上一關基礎上,殭屍佇列排頭增加乙隻血量為a2點的殭屍,與後乙隻殭屍距離d 公尺,從距離房子x2 公尺處勻速接近,你們重新放置攻擊力為y2 點/秒的植物;……;第n 關,殭屍佇列共有n 只殭屍,相鄰兩隻殭屍距離d 公尺,排頭殭屍血量為an 點,排第二的殭屍血量a_n −1 ,以此類推,排頭殭屍從距離房子xn 公尺處勻速接近,其餘殭屍跟隨排頭同時接近,你們重新放置攻擊力為yn 點/秒的植物。
每只殭屍直線移動速度均為1 公尺/秒,由於植物射擊速度遠大於殭屍移動速度,可忽略植物子彈在空中的時間。所有殭屍同時出現並接近,因此當乙隻殭屍死亡後,下乙隻殭屍立刻開始受到植物子彈的傷害。
遊戲得分取決於你們放置的植物攻擊力的總和σyi (1<=i<=n),和越小分數越高,為了追求分數上界,你們每關都要放置攻擊力盡量小的植物。
對於30%的資料,n≤ 10^3 ;
對於50%的資料,n≤ 10^4 ;
對於70%的資料,1≤n≤10^5,1≤d≤10^6 ,1≤x≤10^6 ,1≤a≤10^6 ;
對於100%的資料, 1≤n≤10^5,1≤d≤10^12 ,1≤x≤10^12 ,1≤a≤10^12 ;
對於每個i的答案分別計算。對於當前的i,設su
m[i]
=∑ij
=1a[
i]答案就是ma
x(f[
i]−f
[j−1
]x[i
]+d∗
(i−j
))(1
≤j≤i
) 。這個答案可以滿足對於i個殭屍所要滿足的條件。
做到這裡,就可以得到可觀的分數了。
觀察這個式子,不難發現,分子和分母都可以分成兩部分,分別與i、j有關。那麼求答案這一步就相當於求乙個點(d * j,f[j-1])(1≤j≤i),使得它與(x[i]+d * i,f[i])所連直線的斜率最大。資料的d、a都是正數,所以x[i]+d*i和f[i]都是遞增的。在順序列舉i的同時,維護乙個下凸殼,然後在凸殼上三分答案即可。
#include
#include
#include
#define db double
using
namespace
std;
const
int maxn=100005;
int n,top,l,r,m1,m2;
db x[maxn],y[maxn],f[maxn],a[maxn],x[maxn],ans,d;
db calc(int i,int j)
bool check(db x1,db y1,db x2,db y2,db x,db y)
int main()
for (int i=1;i<=n;i++)
printf("%.0lf\n",ans);
return
0;}
SDOI2013 保護出題人
點此看題 感覺這道題網上講解不是特別清楚,我來補一發詳細講解吧,因為作者也是花了好久才搞懂。首先把題目所求轉化成形式化表達 其中s ss是生命值a aa的字首和 i 1nmax j 1is i s j 1 x i i j d sum n max i frac i 1 n j 1maxi x i i ...
Sdoi2013 保護出題人 三分 單調棧
description 題意好長啊,自己去看吧。sample input 5 2 3 3 1 1 10 8 4 8 2 3sample output 7設a的字首和為s 這道題首先可以推出乙個式子,第i位答案為 max s i s j 1 d i d i j 然後能拿60分。然後維護乙個下凸包,然後...
SDOI2013 BZOJ3203 保護出題人
description input 第一行兩個空格隔開的正整數n和d,分別表示關數和相鄰殭屍間的距離。接下來n行每行兩個空格隔開的正整數,第i 1行為ai和 xi,分別表示相比上一關在殭屍佇列排頭增加血量為ai 點的殭屍,排頭殭屍從距離房子xi公尺處開始接近。output 乙個數,n關植物攻擊力的最...