題目大意:
給你乙個長度為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...