洛谷P6477 子串行問題

2022-06-13 22:36:14 字數 1208 閱讀 9168

題目描述

給定乙個長度為 \(n\) 的正整數序列 \(a_1\), \(a_2\), \(\cdots\), \(a_n\)。定義乙個函式 \(f(l,r)\) 表示:序列中下標在 \([l,r]\) 範圍內的子區間中,不同的整數個數。換句話說,\(f(l,r)\) 就是集合 \(\,\cdots,a_r\}\) 的大小,這裡的集合是不可重集,即集合中的元素互不相等。

現在,請你求出 \(\sum_^n\sum_^n (f(l,r))^2\)。由於答案可能很大,請輸出答案對 \(10^9 +7\) 取模的結果。

考試時居然先寫了這題再寫 t1 的。。。主要是 t1 一眼沒看出結論。

我們考慮列舉右端點 \(r\),對於第 \(l\) 個數,我們記錄 \(f[l]\) 表示 \([l,r]\) 中不同的數字個數。

假設我們已經通過某種奇妙的方法求出了 \(r=i\) 時的 \(f\)。接下來我們求 \(r=i+1\) 時的 \(f\)。

維護平方?套路性拆開,依舊維護區間平方和、區間和即可。

線段樹就可以輕鬆解決這些問題。

時間複雜度 \(o(n\log n)\)。

#include #include #include #include using namespace std;

typedef long long ll;

const int n=1000010,mod=1e9+7;

int n,a[n],b[n],last[n];

ll ans;

inline int read()

struct segtree

void update(int x,int ql,int qr)

if (lazy[x])

register int mid=(l[x]+r[x])>>1;

if (qr<=mid) update(x*2,ql,qr);

else if (ql>mid) update(x*2+1,ql,qr);

else update(x*2,ql,mid),update(x*2+1,mid+1,qr);

sum[x]=(sum[x*2]+sum[x*2+1])%mod;

mul[x]=(mul[x*2]+mul[x*2+1])%mod;

}}seg;

int main()

printf("%lld",ans);

return 0;

}

洛谷 P1410 子串行

這題乍一看毫無思路。顯然不可能窮舉長度為n 2的嚴格遞增子串行。不過聯想到noip1999 普及組 的飛彈攔截的第二問,就有思路了。這題其實與它的第二問差不多,只要算出該序列的最大非公升子串行長度l,判斷一下是否大於2即可。1.假如l 2,顯然乙個嚴格遞增子串行至多包含非公升子串行的乙個元素,2個子...

洛谷 P1410 子串行

給定乙個長度為n n為偶數 的序列,問能否將其劃分為兩個長度為n 2的嚴格遞增子串行,輸入格式 若干行,每行表示一組資料。對於每組資料,首先輸入乙個整數n,表示序列的長度。之後n個整數表示這個序列。輸出格式 同輸入行數。對於每組資料,如果存在一種劃分,則輸出 yes 否則輸出 no 輸入樣例 1 6...

洛谷P1410 子串行

給定乙個長度為n n為偶數 的序列,問能否將其劃分為兩個長度為n 2的嚴格遞增子串行,輸入格式 若干行,每行表示一組資料。對於每組資料,首先輸入乙個整數n,表示序列的長度。之後n個整數表示這個序列。輸出格式 同輸入行數。對於每組資料,如果存在一種劃分,則輸出 yes 否則輸出 no 輸入樣例 1 6...