NOI Online 2 提高組 子串行問題

2022-03-29 11:06:29 字數 1082 閱讀 8075

給定乙個長度為 $n$ 的正整數序列 $a$。定義乙個函式 $f(l,r)$ 表示:序列中下標在 $[l,r]$ 範圍內的子區間中,不同的整數個數。

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

挺有意思的題目。

比如乙個數 $a_i$,它對哪些 $f()$ 是有貢獻的呢?

比如乙個集合 $s$,裡面包含了兩個 $x$,那麼我們可以欽定第乙個 $x$ 對 $f(s)$ 造成了 $1$ 的貢獻,第二個 $x$ 沒有貢獻。

所以,當 $l\in[last_ + 1, i], r \in[i, n]$ 時,$a_i$ 被包含進了區間內,且一定是第乙個這種數,所以它會對這些 $f(l, r)$ 都造成了 $1$ 的貢獻。

那麼這時候我們就可以開乙個平面了,橫軸表示 $l$,縱軸表示 $r$,每次把橫座標在 $[last_ + 1, i]$,縱座標在 $[i, n]$ 的這個矩形的每個元素的權值 $+1$,最後的答案就是每個元素的值的平方和。

難道是二維線段樹/樹套樹?空間顯然是不夠的。

這時候難道要用掃瞄線了嗎?當然不是,太麻煩了。

我們沿用掃瞄線的思想,觀察一下這些矩形有什麼特點。

我們發現,第 $i$ 個矩形的縱座標下端點是 $i$,上端點是 $n$,那麼我們如果使用水平掃瞄線的話,所有的 $-1$ 標記都是在平面的頂端,所以,我們可以忽視所有的 $-1$ 標記。

於是,題目就變成了,$i$ 次,每次先把 $[last_+1, i]$ 的位置的權值 $+1$,然後查詢全域性平方和,發現這個用一維線段樹是很好維護的。

具體實現細節的話,讀入進來的 $a_i$ 首先要離散化,然後按照上面的進行就行了,至於線段樹怎麼維護區間加,全域性平方和,可以考慮維護區間和 $sum$ 和區間平方和 $sum_2$,比如現在要把 $[l,r]$ 這一段都 $+v$,其實就是:

這時因為比如對於乙個數字 $n$,由 $n^2 \to (n+v)^2$ 其實就是 $n^2 \to n^2 + v^2 + 2nv$,也就是加上了 $v^2 + 2nv$。

**就很好寫了,注意卡常。

NOI Online 2 提高組 子串行問題

題目已經說得很清楚了 我們考慮記 f i sum if k,i 2 考慮 f i 如何由 f 遞推過來 我們用 pre 表示 a i 這個值上一次出現的位置 從未出現過則記為0 下面簡記為 j 根據定義,f i sum if k,i 2 f sum f k,i 1 2 同時對於 forall k l...

NOI Online 2 提高組 遊記

沒 noi online 1 掛的慘就來寫遊記吧,不知道為啥 noi online 1 民間資料測得 60 分的 t1 最後爆零了.昏昏沉沉的醒來,吃了早飯,等到 8 30 進入比賽網頁。這次 ccf 吸取了上次的教訓,上去很快一點都不卡 體驗感很好 先看了 t1,然後突然覺得自己打某次 cf 做過...

NOI Online2 提高組 子串行問題 題解

題目傳送門 題目大意 給出乙個序列,求 1 i j n f i,j 2 sum f i,j 2 1 i j n f i,j 2 其中 f i j f i,j f i,j 表示 i ii j jj 有多少個不同的元素。思路挺簡單的,先考慮固定 l 1 l 1l 1,然後求出所有 f 1 r f 1,r...