解法:
這個題首先考慮乙個簡單情況:對於區間[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有多少個奇質數...