假定有乙個無限長的數軸,數軸上每個座標上的數都是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...