字首和 離散化

2022-03-13 06:22:57 字數 1249 閱讀 8625

現在正在上課,但我還是要同步更新博文。。。\滑稽

先講乙個離散化,就是把幾個離的特別遠的數在不影響結果的情況下,變成相近的數。倒是沒什麼影響,但應用在陣列下標的話可以節約空間。(貌似和hash有點像)

直接拍**

給定n個數,如果乙個數出現x次,則對答案的貢獻為x^2

。求這n個數對答案的貢獻是多少。

n<=100000。

f[i]  i這個數字出現了幾次

cin>>n;

for (int i=1; i<=n; i++) cin>>a[i];

... 離散化

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

sort(t+1,t+n+1

,cmp);

for (int i=1; i<=n; i++) while (!a[t[i].y]==t[i].x);

a[t[i].y] 一定等於 t[i].x

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

...for (int i=1; i<=n; i++) f[a[i]]++;

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

ans+=f[i]*f[i];

cout

《字首和是個好東西,可以方便的操作。(每次加前乙個,找區間時整體相減)

來乙個矩陣字首和

給定乙個n*n的矩陣ai,j以及m個詢問。

每次詢問乙個子矩陣的和。

要求乙個o(n*n+m)的做法。

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

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

f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];

f[i][j] 左上角在(

1,1),右下角在(i,j)的和是多少

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

還有乙個差值的陣列,f中存的是每個數和前乙個數的差值,特殊的,f[1] = 本身。

附贈**:

cin>>n;

for (i=1; i<=n; i++) cin>>a[i];

cin>>m;

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

for (i=1; i<=n; i++) f[i]=f[i-1]+f[i];

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

';

captain最鉅!!!

數列(字首和,離散化)

p1667 數列 給定乙個長度是n的數列a,我們稱乙個數列是完美的,當且僅當對於其任意連續子串行的和都是正的。現在你有乙個操作可以改變量列,選擇乙個區間 x,y 滿足ax ax 1 ay 0,1輸入格式 第一行乙個數n,以下n個數。資料規模 對於20 的資料,滿足1 n 5 對於100 的資料,滿足...

離散化系列 離散化 字首和 差分

區間和 acwing 802.區間和 這道題所展現的情況就是,資料並不是很多,利用到的元素值也不大,但關鍵就是下標太大,無法正常的以陣列下標來進行操作。因此,離散化,在這裡就是很合適了,把大的下標對映為小的下標後再進行處理。對於這道題的解題步驟具體可分為一下幾步 1.儲存,就是將所用用到的下標存起來...

區間和(離散化 二分 字首和)

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