1. 程式人生 > >17/10/24題目泛做

17/10/24題目泛做

集訓題

JZOJ 5417

題意:求二維和與RMQ,保證每次查詢的區間長寬不超過整個矩陣長寬的一半
分析:二維和沒難度,二維RMQ這裡因為資料有問題(?)只好開short水過,同時順便加上了連續訪問的黑科技然後卡了過去
不過正解是經典的思想,就是一種簡單的變形(但好難寫啊QAQ),我們考慮f(i,j,k)表示以(i,j)為左上角,邊長2k的正方形的RMQ,然後很顯然滿足題意的區間只用最少8個就可以全部覆蓋,那麼這裡就可以空間開的足夠小了(甚至不用卡)

JZOJ 5418

題意:給出最多n個約束表示某個數要在另一個數左邊,問能有多少種可行排列
分析:做過的題……首先這裡如果有環的話顯然答案是0

,那麼就只能是一堆森林了。然後設多一個虛擬節點,就直接樹形DP,我們考慮f(x)x子樹所對應序列的方案數,若將x的直接孩子記為soni(x)(也就是存在關於x的直接約束),我們馬上可以看出對於每個孩子分別方案數算好後乘在一起,就相當於若干種元素的帶重排列了,那麼DP方程顯然:

f(x)=(size(soni(x)))!(size(soni(x)))!f(soni(x))
預處理下階乘就好了,預處理的時候用了O(n+lgn)的黑科技跑進了第一頁(目前)

JZOJ 5419

題意:改變某個位置上的數,改變一個區間內位置的可選情況,問每次改變後怎樣選一個位置使得所有位置上數及位置間距離乘積的和最小(即選一個k

最小化i=1nvi|ik|
分析:因為每個位置上的學生數目都非負,那麼容易看出每個位置上距離和有單調性,我們如果不考慮某個區間可選還是不可選,那麼剛剛好最後一個使得和上一個距離和的差小於等於0的位置就是答案
這個東西非常類似申請空間的一類線段樹問題,於是我們就可以用線段樹去強行維護,標記下放還挺好想的
至於有位置可選情況的操作問題,我們同樣可以線段樹一波,因為這裡單調性和區間沒什麼關係,我們只要找到沒被覆蓋的區域裡面靠左最近的可行點和靠右最近的可行點就好了(如果原來需要選的位置被覆蓋了就只能這樣了)

補題解

JZOJ 5232

遠古時期的題目……

題意:給出n個隨機數的數列,第i

個數的範圍是[li,ri]裡隨機的整數,求將數列排序後每個數的期望排名與另一個權值si的乘積和
分析:現在看來似乎不是很難做?(霧)
我們考慮掃一遍的時候維護一個桶,用來表示某個取值的數的期望個數,然後考慮第i個數,暴力考慮[li,ri]的範圍,每一個位置有1rili+1的貢獻,然後求每個答案的時候同樣列舉下[li,ri],每一次都暴力掃前面的數加起來搞貢獻,再暴力求和乘因子(同上)就可以做了
但是這個樣子太暴力了,我們需要資料結構維護……考慮這裡要支援的無非是區間加+區間等差型求和,差分一下(或者說考慮每個數對後面的貢獻,對於[li,ri]範圍內的就是向上的直線,然後對比ri大的貢獻就固定了),就變成了GDOI老題的弱化版,考慮線段樹標記下傳的時候,直接拆成兩半,中間的貢獻用數列的公式直接算就好了……

對了,如果是實數怎麼辦?木子爺也秒掉了……用積分可以發現是12x2的貢獻,然後就變成兩邊都等差數列了,多維護一個和,還是可以直接做……