P2629 好訊息,壞訊息

2022-05-31 13:33:11 字數 1125 閱讀 1432

描述:

uim在公司裡面當秘書,現在有n條訊息要告知老闆。每條訊息有乙個好壞度,這會影響老闆的心情。告知完一條訊息後,老闆的心情等於之前老闆的心情加上這條訊息的好壞度。最開始老闆的心情是0,一旦老闆心情到了0以下就會勃然大怒,炒了uim的魷魚。

uim為了不被炒,知道了了這些訊息(已經按時間的發生順序進行了排列)的好壞度,希望研究如何不讓老闆發怒。

uim必須按照時間的發生順序逐條將訊息告知給老闆。不過uim可以使用一種叫「倒敘」的手法,例如有n條訊息,小a可以從k,k+1,k+2...n,1,2...k-1這種順序通報。

他希望知道,有多少個k,從k開始通報到n然後從1通報到k-1可以讓老闆不發怒。

又是比較難想的一題,雖然這已經是第二次做了........

首先區間牽涉到k~n,n~1,那麼大概率是要斷環為鏈的。

斷環為鏈後,題目要求就變為了:對於每乙個合法的k,都要滿足k--(n+k-1)中,到任意一點的和都是非負的。熟悉字首和的人應該知道,如果用 s [ i ] 表示1--i的所有數的和,那麼s [ j ] - s [ i-1 ] 就是i--j所有數的和。所以用字首和預處理後,s [ i ] - s [ k-1 ] 就是k--i (k<=i<=n+k-1)的和了,我們只要判斷這個和是否為負即可。

既然這麼說,那麼是否要判斷k--n+k-1中每乙個數的和呢?當然不是,因為其中如果只要有一點的和是負的,那麼這個k就是不合法的了,所以我們只需要判斷一次——判斷最小的si減去s[k-1]是否為負

接下來就是單調佇列的事了。

#include using

namespace

std;

typedef

long

long

ll;ll n,p[

2000009],q[2000009

];ll a[

2000009],sumn[2000009],he[2000009

];int

main()

int ans=0

;

for(int i=1;i<=n;i++)

if(he[i]-sumn[i]>=0) ans++;

cout

<}

P2629 好訊息,壞訊息

uim在公司裡面當秘書,現在有n條訊息要告知老闆。每條訊息有乙個好壞度,這會影響老闆的心情。告知完一條訊息後,老闆的心情等於之前老闆的心情加上這條訊息的好壞度。最開始老闆的心情是0,一旦老闆心情到了0以下就會勃然大怒,炒了uim的魷魚。uim為了不被炒,知道了了這些訊息 已經按時間的發生順序進行了排...

P2629 好訊息,壞訊息

原題鏈結 單調佇列 字首和 之前一直不理解滑動視窗,通過這道題理解了點,i是視窗右邊節點,i k 1是視窗左邊界點,而單調佇列是用來求該視窗相關屬性的乙個工具,q hh 不一定等於視窗的左邊界.比如,本道題q hh 是用來求視窗下最小和的下標,與i k 1的下標無關,我們求cnt是否 1只需要判斷左...

好訊息,壞訊息(洛谷 P2629)

題目描述 uim在公司裡面當秘書,現在有n條訊息要告知老闆。每條訊息有乙個好壞度,這會影響老闆的心情。告知完一條訊息後,老闆的心情等於之前老闆的心情加上這條訊息的好壞度。最開始老闆的心情是0,一旦老闆心情到了0以下就會勃然大怒,炒了uim的魷魚。uim為了不被炒,知道了了這些訊息 已經按時間的發生順...