小陽買水果(線段樹維護最大值 樹上二分)

2021-09-25 11:16:04 字數 1521 閱讀 1944

【題目鏈結】

給n個數(含負數)

連續區間和大於0,區間長度最大

【題解】

預處理字首和並插入到線段樹里維護最大值。列舉字首和,然後在當前 字首和 位置i到n範圍上找離i位置最遠且大於 當前字首和 的字首和。怎麼找最遠呢?線段樹上優先查詢右兒子的區間就可以實現了。

【**】

/*¼ò»¯°æ*/

#include#define rep(i,a,b) for(int i=a;i<=(b);++i)

#define mem(a,x) memset(a,x,sizeof(a))

#define pb push_back

using namespace std;

typedef long long ll;

const int n=2e6+10;

const ll mod=1e9+7;

int sum[n],s[n*4];

int n;

void up(int id,int l,int r,int pos)

int mid=l+r>>1;

if(pos<=mid) up(id<<1,l,mid,pos);

else up(id<<1|1,mid+1,r,pos);

s[id]=max(s[id<<1],s[id<<1|1]);

}int qu(int id,int l,int r,int val)

int ans=0;

int mid=l+r>>1;

if(s[id<<1|1]>val) return qu(id<<1|1,mid+1,r,val);

if(s[id<<1]>val)return qu(id<<1,l,mid,val);

return -1;

}int main()

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

int ans=0;

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

printf("%d\n",ans);

}

【題目】

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 262144k,其他語言524288k

64bit io format: %lld

水果店裡有 nn個水果排成一列。店長要求顧客只能買一段連續的水果。

小陽對每個水果都有乙個喜愛程度 aiai,最終的滿意度為他買到的水果的喜歡程度之和。

如果和為正(不管是正多少,只要大於 00 即可),他就滿意了。

小陽想知道在他滿意的條件下最多能買多少個水果。

你能幫幫他嗎?

第一行輸入乙個正整數 n,表示水果總數。

第二行輸入 n 個整數 aiai,表示小陽對每個水果的喜愛程度。

一行乙個整數表示結果。(如果 1 個水果都買不了,請輸出 0)
示例1

複製

5

0 0 -7 -6 1

複製

1
1≤n≤2×106,|ai|≤103

I Hate It(線段樹維護區間最大值)

題意 給定乙個原始陣列,有2種操作,第一種操作是單點修改id為a的學生的成績改為b,第二種操作是詢問區間a到b中分值最大的一位。思路 用線段樹維護區間最大值,每次修改之後不斷向上更新區間最大值即可。include using namespace std typedef long long ll co...

51nod 1376 線段樹維護區間最大值

引自 wonter巨巨的部落格 定義 dp i 以數字 i 不是下標 i 為結尾的最長上公升長度 然後用線段樹維護 dp i 每個節點維護 2 個資訊,乙個是當前區間的最大上公升長度,乙個是最大上公升長度的方案數,這裡再詳細說下這篇題解。也是弱弱自己的理解吧。以1 n的值為線段樹所代表的區間 然後依...

hdu I hate it 區間最大值 線段樹

include define maxn 200001 define lson l,mid,rt 1 define rson mid 1,r,rt 1 1 int max maxn 2 int n,m int max int a,int b void pushup int rt 要理解好更新的定義,不...