題面:
your are given two sequences a1…
n,b1
…n
a_,b_
a1…n,
b1…n
you need to answer max1
≤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 ...