sequence 牛客 ( 線段樹)

2021-09-25 17:17:53 字數 3346 閱讀 4041

題面:

your are given two sequences a1…

n,b1

…n

a_,b_

a1…n​,

b1…n

​ you need to answer max⁡1

≤l≤r

≤n

\displaystyle \max_ \) \times sum(b_)\}

1≤l≤r≤

nmax​−1e

6

,b

i<1e

6-1e6−1

e6​,bi

​<1e

6 思路:用單調棧求出以aia_

ai​為最小值的左右邊界,對b陣列字首和,用線段樹維護最大值最小值

列舉每個位置p:

若 a[

p]

>0,

,要使得

區間和盡

可能的大

,max

(sum

[i],

i∈[p

,r])

−min

(sum

[i],

i∈[l

−1,p

−1])

若a[p]>0,,要使得區間和盡可能的大,max(sum[i],i\in[p,r])-min(sum[i],i\in[l-1,p-1])

若a[p

]>0,

,要使得

區間和盡

可能的大

,max

(sum

[i],

i∈[p

,r])

−min

(sum

[i],

i∈[l

−1,p

−1])

若 a[

p]

<0,

要使得區

間和盡可

能的小,

min(

sum[

i],i

∈[p,

r])−

max(

sum[

i],i

∈[l−

1,p−

1]

)若a[p]<0,要使得區間和盡可能的小,min(sum[i],i\in[p,r])-max(sum[i],i\in[l-1,p-1])

若a[p

]<0,

要使得區

間和盡可

能的小,

min(

sum[

i],i

∈[p,

r])−

max(

sum[

i],i

∈[l−

1,p−

1])

#include

#define lson l,mid,root<<1

#define rson mid+1,r,root<<1|1

using

namespace std;

typedef

long

long ll;

const

int n=

3e6+5;

int a[n]

,b[n]

;ll tree[n<<2]

[2];

ll sum[n]

;int l[n]

,r[n]

;stack<

int>s;

void

build

(int l,

int r,

int root)

int mid=

(l+r)

>>1;

build

(lson)

;build

(rson)

; tree[root][0

]=min(tree[root<<1]

[0],tree[root<<1|

1][0

]); tree[root][1

]=max(tree[root<<1]

[1],tree[root<<1|

1][1

]);}

ll querymax

(int l,

int r,

int l,

int r,

int root)

int mid=

(l+r)

>>1;

ll ans=-(

1ll<<60)

;if(l<=mid)

ans=

max(ans,

querymax

(l,r,lson));

if(r>mid)

ans=

max(ans,

querymax

(l,r,rson));

return ans;

}ll querymin

(int l,

int r,

int l,

int r,

int root)

int mid=

(l+r)

>>1;

ll ans=

(1ll

<<60)

;if(l<=mid)

ans=

min(ans,

querymin

(l,r,lson));

if(r>mid)

ans=

min(ans,

querymin

(l,r,rson));

return ans;

}int

main()

build(0

,n,1);

for(

int i=

1;i<=n;i++

)while

(!s.

empty()

)s.pop()

;for

(int i=n;i>

0;i--

) ll ans=-(

1ll<<60)

;for

(int i=

1;i<=n;i++)if

(a[i]

<0)

ans=

max(

1ll*a[i]*(

querymax

(i,r[i],0

,n,1)-

querymin

(l[i]-1

,i-1,0

,n,1))

,ans);}

printf

("%lld\n"

,ans)

;return0;

}

牛客網 sequence 線段樹 單調棧

官方題解 假設a中的元素互不相同,我們考慮a中的某個元素作為min的時刻。對於每個a i 我們找到左邊第乙個比它大的元素a l 右邊第乙個比它大的a r 那麼左端點在 l 1,i 右端點在 i,r 1 的區間min就為它。求l和r可以使用單調棧。考慮如何求某個a i 作為min的答案。如果a i 0...

帶 sin, cos 的線段樹 牛客

題意 給你 n 個數字,第一種操作是將乙個區間內每乙個數字加上同乙個數字,第二種操作是求乙個區間內每乙個數 sin 的累加和 思路分析 對於每個區間維護一下 cos 和 sin 的值,當乙個區間要加上乙個數字時,此時再重新計算 sin的值時 sin a x sin a cos x cos a sin...

Sequence(線段樹 二分)

傳送門 第二次做這種題目,把人做傻了,沒想到是二分,只是隱隱約約感覺到了二分的影子。於是寫了兩個查詢的函式,但是發現查詢的函式無法解決求左邊最大值和右邊最小值的問題。寫了一大堆爛 正解只需要在查詢的時候不斷二分就行了。include using namespace std typedef long ...