字首和演算法是一種重要的預處理演算法,能大大降低查詢的時間複雜度。最簡單的題目就是:給定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 因為我們不想掃瞄整表,故考慮用索引。單列索引 ...