BJOI2016 迴轉壽司 題解

2022-09-20 10:36:11 字數 1211 閱讀 4970

傳送門qaq

給定乙個長度為 \(n\) 的序列 \(a\),給定邊界 \(l\) 和 \(r\),求出滿足 \(l \le \sum\limits_^r a_i \le r\) 的 \((l,r)\) 的數量。

簽到題,感覺紫題太高看它了,真實難度頂多綠題。

考慮列舉 \(r\),計算出所有滿足題意的 \(l\) 的數量。

設 \(s\) 為 \(a\) 的字首和陣列,若 \(l \le s_r - s_l \le r\),則區間 \((l,r]\) 滿足題意。

作乙個簡單的變化就能求出 \(s_l\) 的範圍:\(s_r - r\le s_l\le s_r - l\)。

那麼我們依次列舉 \(1\ldots n\) 作為 \(r\),維護 \(s_0 \ldots s_\) 即可。

可以使用樹狀陣列+離散化或者動態開點權值線段樹,我選擇的是樹狀陣列+離散化。

時間複雜度 \(o(n\log n)\)。

#include #include #include using namespace std;

const int maxn = 1e5 + 5;

typedef long long ll;

const int maxm = 4e5 + 5;

int n,cnt;

ll l,r,a[maxn],d[maxm],c[maxm],s[maxn];

int sum[maxm];

int lowbit(int x)

void add(int x,int y)

int query(int x)

int main()

for(int i = 1;i <= cnt;++ i)c[i] = d[i];

sort(c + 1 , c + 1 + cnt);

cnt = unique(c + 1 , c + 1 + cnt) - c - 1;

for(int i = 1;i <= 3 * n + 1;++ i)d[i] = lower_bound(c + 1 , c + 1 + cnt , d[i]) - c;

add(d[1] , 1);//提前插入 s[0]

ll ans = 0;

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

printf("%lld",ans);

return 0;

}

完結撒花✿✿ヽ(°▽°)ノ✿

BJOI2016 迴轉壽司

題目鏈結 給定乙個長度為 n 的序列 a 和乙個區間 l,r 求多少連續子串行的權值和在區間內,即滿足 1 le i le j le n 且滿足 l le sum a i le r 的方案數。區間和,很容易想到用字首和轉換,這樣區間相關變成了兩個點。設 s 為 a 的字首和,那麼統計就變成了這樣。統...

BJOI2016 迴轉壽司

似乎沒有人打平衡樹的題解,那我就來水一發 我們將題目做乙個簡單的轉化 設 sum i sum a j 那麼答案就是 sum sum l leq sum i sum leq r 我們可以利用容斥的思想進行簡單是轉化 sum sum l leq sum i sum sum sum r sum i sum...

做題記錄 BJOI2016 水晶

乙個六邊形網格的座標用 x,y,z 來描述乙個單元的位置,表示從原點開始按如圖所示的 x,y,z 方向各走若干步之後到達的地方。已知有 n 個水晶,並給出座標與價值。定義能量源為滿足座標 x y z equiv0 pmod3 若其上面有水晶,則價值加上 10 炸掉一些水晶,使得 沒有 a 共振 如果...