洛谷 1485 火槍打怪

2021-06-18 21:58:20 字數 1802 閱讀 8621

lxl進入到了一片叢林,結果他發現有n只怪物排成一排站在他面前。lxl有一桿火槍能對付這些怪物。他知道從左至右數第i只怪物的血量是mi。現在lxl可以將一些子彈射向某個怪物。lxl可以控制他所發射的子彈數量及子彈的威力值。當某個子彈射到第i個怪物,如果這個子彈的威力值為p,除了這個怪物會掉p點血以外,它左邊的第j個怪物(j

第一行,兩個正整數n,k。

第二行,n個正整數,第i個正整數表示從左至右數第i只怪物的血量mi。

乙個正整數,表示子彈的最小威力值p。

3 1

1 4 5

6

對於30%的資料,n<=300。

對於100%的資料,n<=500000,k<=500000,1<=mi<=10^10

一看到這個題就想到了首先肯定打最右面的 打死乙個向前走再打最後沒死的。。。喪心病狂

然後傷害 就想到了二分

二分很簡單 但是驗證不簡單

由於傷害向左濺射

一開始列舉每乙個打的 然後將傷害向左濺射一次  時間複雜度約 n^2 * log n

然後只能過3個點

看題解上說的o(n)驗證很厲害啊

節省時間就直接抄過來吧。。。

容易注意到隨著p的增大,所需要的子彈數單調遞減。於是我們便會想到二分答案,但這並不是難點,本題的難點在於:對於乙個二分出的p,如何快速計算出它所需要的子彈數?

由於本題中子彈的濺射傷害只是向左,故很容易想到子彈應從右打起,打到怪物被消滅為止。但如果樸素計算濺射傷害,複雜度可能高達o(n^2),無法通過本題。所以我們需要乙個更優的計算方法。

我們設對於二分出的p,射到從左到右第s個怪物身上的子彈數為kk[s]。對於p-(i-j)*(i-j)我們將它拆開,變成-j^2+2ij-i^2+p。對於第j個怪,它受到的濺射傷害應為-(kk[j+1]+...+kk[n])*j^2+2*(kk[j+1]*(j+1)+...+kk[n]*n)*j-(kk[j+1]*(j+1)^2+...+kk[n]*n^2)+(kk[j+1]+...+kk[n])*p。

這其實是把濺射傷害的值表示為乙個二次函式。而二次函式每一項的係數都是可累加的,濺射傷害可以隨著迴圈算出。而當p-(i-j)*(i-j)<0時,我們便需要把對應的i從係數中減去。每一位至多只會被減去一次,故總複雜度仍不變,對於乙個二分出的p,計算出它所需要的子彈數的時間複雜度仍為o(n)

#include#include#include#includeusing namespace std;

long long s[500011];

int use[500011];

int m,n,a,b,c;

long long l,r,mid,ans;

long long lim;

long long life;

long long t1,t2,t3,used;

inline bool ok()

if(a+lim<=m&&use[a+lim])

life=mid*t1-a*a*t1+2*a*t2-t3;

if(s[a]>=life)

if(used>n)return false;

}return true;

}int main()

l=s[m]/n;

r=r/n+1;

while(l<=r)

else

l=mid+1;

}cout<

一開始寫的渣n^2的驗證

bool ok()

}return true;

}

洛谷 桌球

國際乒聯現在主席沙拉拉自從上任以來就立志於推行一系列改革,以推動桌球運動在全球的普及。其中111111分制改革引起了很大的爭議,有一部分球員因為無法適應新規則只能選擇退役。華華就是其中一位,他退役之後走上了桌球研究工作,意圖弄明白111111分制和212121分制對選手的不同影響。在開展他的研究之前...

洛谷 保齡球

dl 算緣分算得很煩悶,所以常常到體育館去打保齡球解悶。因為他保齡球已經打了幾十年了,所以技術上不成問題,於是他就想玩點新花招。dl 的視力真的很不錯,竟然能夠數清楚在他前方十公尺左右每個位置的瓶子的數量。他突然發現這是乙個炫耀自己好視力的藉口 他看清遠方瓶子的個數後從某個位置發球,這樣就能打倒一定...

洛谷 1357 花園

的運算優先順序低於 貌似對矩陣理解更深刻了!2 m 5,相鄰的m個花圃可能有2 m種狀態 用0 2 m 1來表示 要求有不超過k個c形花圃,對應其二進位制形式中的0不超過k個。標記出0 2 m 1中滿足條件的狀態x,對於每個狀態x,前m個花圃會出現1次 f i,x 表示前i個花圃中,最後m個花圃的狀...