最左字首原則 字首和例項解析

2021-10-12 18:27:17 字數 1530 閱讀 8792

字首和演算法是一種重要的預處理演算法,能大大降低查詢的時間複雜度。最簡單的題目就是:給定n個數和m次詢問,每次詢問一段區間的和。

查詢乙個區間的和我們可以從加法轉換為減法,查詢從l到r區間數字的和,其實可以轉換為前r之和減去前l-1項之和。如下所示:

sum[0]=0;

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

scanf("%d",&a[i]);

sum[i]=sum[i-1]+a[i];

n個氣球排成一排,從左到右依次編號為1,2,3....n.每次給定2個整數a b(a <= b),lele便為騎上他的「小飛鴿"牌電動車從氣球a開始到氣球b依次給每個氣球塗一次顏色。但是n次以後lele已經忘記了第i個氣球已經塗過幾次顏色了,你能幫他算出每個氣球被塗過幾次顏色嗎? 

輸入:

每個測試例項第一行為乙個整數n,(n <= 100000).接下來的n行,每行包括2個整數a b(1 <= a <= b <= n)。當n = 0,輸入結束。

輸出:

每個測試例項輸出一行,包括n個整數,第i個數代表第i個氣球總共被塗色的次數。 

樣例輸入

1 12 23 3

1 11 2

1 30 

樣例輸出:

1 1 1

3 2 1

每次輸入兩個端點,我們把左端點的值加一,右端點右邊的點的值減一,因為乙個數出現的次數=以這個數為左端點的次數+這個數不是左端點的次數。左端點的值+1表示這個數是左端點,右端點右邊的點的值-1代表這一段區間被這個點截斷,那麼這個點就不加進來了。比如說有兩段區間:1到3和4到6,我們已經計算出了點3的出現次數為1,我們算4出現的次數的時候,一次是以4為起點的那個,再加上3出現的次數(為什麼要加上3出現的次數呢,可以這樣認為,因為我們其實是假設相鄰兩個數是同時出現的,如果不同時出現就會被後面的數截斷)也就是1,這就是2次了,但是因為第一段區間被4截斷了,所以還有減掉一次,所以就是一次了。合計合計c[i]就代表了該數字的最終出現次數。

#include

#include

using namespace std;

int c[100001];

int main()

int n,a,b,i;

while(cin>>n && n)

memset(c,0,sizeof(c));

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

cin>>a>>b;

c[a]++;

c[b+1]--;

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

c[i]+=c[i-1];

printf("%d%c ",c[i],i==n?'\n':' ');

篩法求素數

2019常州市賽題解:投籃

程式設計小能手集訓課1參考程式及結構體排序方法

常州市賽題解:小x轉進製

最左字首原則

當b 樹的資料項是復合的資料結構,比如 name,age,的時候,b 數是按照從左到右的順序來建立搜尋樹的,比如當 張三,20,f 這樣的資料來檢索的時候,b 樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和 最後得到檢索的資料 但當 20,f 這樣的沒有name的資料...

MySql最左字首原則

企業的筆試題,對資料庫這塊了解很淺,所以還是記錄一下吧。b tree 索引和 hash 索引的對比 對於 b tree 和 hash 資料結構的理解能夠有助於 不同儲存引擎下使用不同索引的查詢效能的差異,尤其是那些允許你選擇 b tree 或者 hash 索引的記憶體儲存引擎。b tree 索引的特...

MySql最左字首原則

最左字首原則 通過例項理解單列索引 多列索引以及最左字首原則 例項 現在我們想查出滿足以下條件的使用者id mysql select uid from people where lname liu and fname zhiqun and age 26 因為我們不想掃瞄整表,故考慮用索引。單列索引 ...