ARC075 E 離散化 樹狀陣列 水

2021-10-10 10:12:08 字數 1647 閱讀 7122

題目大意:

給你乙個長度為n的序列。問你有多少個子段滿足其算數平均和 ≥

k\geq k

≥k.n≤1

e5,k

≤1e9

n \leq 1e5,k\leq 1e9

n≤1e5,

k≤1e

9 題目思路:

題目條件可以轉化為:sum

[r]−

sum[

l−1]

r−l+

1≤

k\frac \leq k

r−l+1s

um[r

]−su

m[l−

1]​≤

k 將其轉化成:sum

[l−1

]+kl

≤sum

[r]−

kr−k

sum[l-1]+kl\leq sum[r]-kr-k

sum[l−

1]+k

l≤su

m[r]

−kr−

k.那麼我們將序列直接變成字首和序列,那麼式子本質在求合法點對。

所以我們可以列舉r

rr.查詢之前的l

ll滿足上式。

經典trick:因為式子的值可能很大,但是可能的取值最多2n2n

2n個。所以將涉及到的式子全部離散化。然後就可以丟到樹狀陣列裡維護大小關係了.

這裡千萬要注意一點:權值線段樹和樹狀陣列千萬要注意取值域大小,而不是序列長度.

#include

using

namespace std;

#define ll long long

#define pii pair

#define pb push_back

#define mp make_pair

const

int maxn =

6e5+5;

const

int mod =

1e9+7;

ll a[maxn]

, n , k;

ll dist[maxn]

, cnt , sum[maxn]

;int

lowbit

(int x)

void add (

int x , ll c)

}ll ask (ll x)

return ans;

}int

main()

sort

(dist +

1, dist +

1+ cnt)

; cnt =

unique

(dist +

1, dist +

1+ cnt)

- dist -1;

ll ans =0;

ll s =

lower_bound

(dist +

1, dist +

1+ cnt ,

-k)- dist;

add(s ,1)

;for

(ll i =

1; i <= n ; i++

) cout << ans << endl;

return0;

}

離散化 樹狀陣列

題目描述 erwin最近對一種叫 thair 的東西巨感興趣。在含有n個整數的序列a1,a2 an中,三個數被稱作 thair 當且僅當i求乙個序列中 thair 的個數。輸入格式 開始乙個正整數n,以後n個數a1 an。輸出格式 thair 的個數 思路 列舉中間的數字,求排在它前面,小於它的有幾...

Flowers 樹狀陣列 離散化

題意 給你一些花,以及這些花開花的時間,問你在某一時間開花的總個數 很明顯的樹狀陣列題,插線問點。ac include include include include include define n 1000005 using namespace std typedef struct node n...

排序(離散化 樹狀陣列)

題目 資料範圍大,交換相鄰的的樹,使有序 解題說明 關鍵是知道,每個數交換的次數是其前面比它大的樹的個數。用樹狀陣列維護一下 ac include include include includeusing namespace std typedef long long ll const int ma...