離散化 區間和

2021-09-27 08:30:49 字數 1476 閱讀 7162

假定有乙個無限長的數軸,數軸上每個座標上的數都是0。

現在,我們首先進行 n 次操作,每次操作將某一位置x上的數加c。

近下來,進行 m 次詢問,每個詢問包含兩個整數l和r,你需要求出在區間[l, r]之間的所有數的和。

輸入格式

第一行包含兩個整數n和m。

接下來 n 行,每行包含兩個整數x和c。

再接下裡 m 行,每行包含兩個整數l和r。

輸出格式

共m行,每行輸出乙個詢問中所求的區間內數字和。

資料範圍

−109≤x≤109−109≤x≤109,

1≤n,m≤1051≤n,m≤105,

−109≤l≤r≤109−109≤l≤r≤109,

−10000≤c≤10000−10000≤c≤10000

輸入樣例:

3 3

1 23 6

7 51 3

4 67 8

輸出樣例:

8

05

離散化的本質,是對映,將間隔很大的點,對映到相鄰的陣列元素中。減少對空間的需求,也減少計算量。 

離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。

如果開陣列,那麼需要的陣列就太大了,可以用合適大小的陣列將已更改值的下標存入,按順序存,這樣節省空間。

所以要進行排序,然後去重;具體看**;

#include#includeusing namespace std;

const int n = 1e5 + 10;

int n,sum[n];

typedef structpill;

pill a[n];

//排序也可用sort

void quick_sort(int l,int r,pill q)

}quick_sort(l,j,a);quick_sort(j + 1,r,a);

}//尋找大於x的最小下標,也就是更改的第乙個數,沒更改就是0;

int findl(int x)

if(x <= a[l].num)

return l;

else return n + 1;

}//尋找小於r的最大值,也就是在區間[l,r]找已更改的上線;

int findr(int x)

if(x >= a[l].num)

return l;

else return 0;

}int main()

n = j;

//字首和;

for(int i = 1; i <= j; i++) sum[i] = sum[i - 1] + a[i].val;

while(m--)

//for(int i = 1; i <=n; i++)printf("%d ",a[i].num);

return 0;

}

區間和 離散化

假定有乙個無限長的數軸,數軸上每個座標上的數都是0。現在,我們首先進行 n 次操作,每次操作將某一位置x上的數加c。接下來,進行 m 次詢問,每個詢問包含兩個整數l和r,你需要求出在區間 l,r 之間的所有數的和。輸入格式 第一行包含兩個整數n和m。接下來 n 行,每行包含兩個整數x和c。再接下來 ...

區間和 離散化

802.區間和 include include include using namespace std typedef pair int,int pii 定義二元組為 pii int n,m const int n 3e5 10 int a n s n vector int alls 儲存所有待離散...

離散化例題 區間和

802.區間和 假定有乙個無限長的數軸,數軸上每個座標上的數都是0。現在,我們首先進行 n 次操作,每次操作將某一位置x上的數加c。接下來,進行 m 次詢問,每個詢問包含兩個整數l和r,你需要求出在區間 l,r 之間的所有數的和。輸入格式 第一行包含兩個整數n和m。接下來 n 行,每行包含兩個整數x...