51nod 1712 區間求和

2021-07-29 22:48:04 字數 942 閱讀 3947

解法:

這個題首先考慮乙個簡單情況:對於區間[x,y],權值為多少。

容易寫出公式:f[x , y] = s[y] - s[x-1] - (sum[y]-sum[x-1])*(x-1)+sum[x-1]*(y-x+1)

其中s[x]表示 從第乙個元素到第x個元素的 所有有序二元組的和(題目中定義的),sum表示字首和

這裡要求的是所有a[x] == a[y]這樣的區間和,注意到題目所有的數字都在10^6以內,所以可以開幾個陣列去維護每乙個數字對應的資訊。

繼續對寫出的式子進行討論,假如對於當前給定的y,有多個x 滿足a[x] == a[y]

答案就是

sigma f[x,y] = ct * s[y] - sigma s[x-1] - sum[y] * sigma (x-1) + sigma sum[x-1]* y

紅色的部分就是需要維護的部分

開4個陣列,對每個紅字的部分,以數字為下標進行維護。

邊掃瞄邊維護。時間複雜度o(n)

注意mod

做這種題還是先寫出公式,會思路清晰很多。

#include#include#include#include#include#define ll long long int

using namespace std;

const int maxn = 1100000;

ll mod = ( (1ll)<<32);

ll ct[maxn];

ll sx[maxn];

ll lx[maxn];

ll ss[maxn];

int n;

void get(int &x)

void init()

int main()

printf("%lld\n",ans);

}return 0;

}

51nod1680 區間求和(BIT dp)

有n個數,給定乙個k,求所有長度大於等於k的區間中前k大數的總和。這樣就比較簡單相信大家都會,所以此題要求當k 1 n的總和,即求 n k 1 n k 1i 1 nj i k 1 區間前k大和 input 輸入五個數n,a1,a,b,c。a1表示第乙個數,a,b,c用來生成其餘n 1個數。a i a...

51nod 1690 區間求和2

給出乙個長度為n的陣列a。區間 l,r 的值為 r li 0a l i a r i 求所有長度為質數的區間的值的總和。很容易想到,列舉乙個數對,然後統計他的答案 比如說,我們列舉了乙個數對 i j i,j 那麼他的答案的貢獻會有兩種情況 1.i j n 1 i j n 1這個的話,能包含他的區間長度...

51nod 1690 區間求和2

一開始考慮的是對於每個a ia i ai 有哪些a ja j aj 與它相乘,但是這樣做不了。正解是考慮每對 ai aj a i,a j ai a j 的貢獻,然後用fft優化。首先直接把長度為2 22的給算了,然後剩下的都是奇質數長度。預處理s is i si 表示1 11 i ii有多少個奇質數...