洛谷P3643 APIO2016 划艇

2022-02-27 05:45:52 字數 2975 閱讀 1797

在首爾城中,漢江橫貫東西。在漢江的北岸,從西向東星星點點地分布著 \(n\) 個划艇學校,編號依次為 \(1\) 到 \(n\)。每個學校都擁有若干艘划艇。同一所學校的所有划艇顏色相同,不同的學校的划艇顏色互不相同。顏色相同的划艇被認為是一樣的。每個學校可以選擇派出一些划艇參加節日的慶典,也可以選擇不派出任何划艇參加。如果編號為 iii 的學校選擇派出划艇參加慶典,那麼,派出的划艇數量可以在 \(a_i\)​ 至 \(b_i\) 之間任意選擇(\(a_i \leq b_i\))。

值得注意的是,編號為 \(i\) 的學校如果選擇派出划艇參加慶典,那麼它派出的划艇數量必須大於任意一所編號小於它的學校派出的划艇數量。

輸入所有學校的 \(a_i,b_i\)​ 的值,求出參加慶典的划艇有多少種可能的情況,必須有至少一艘划艇參加慶典。兩種情況不同當且僅當有參加慶典的某種顏色的划艇數量不同。

輸入格式:

第一行包括乙個整數 \(n\),表示學校的數量。

接下來 \(n\) 行,每行包括兩個正整數,用來描述一所學校。其中第 \(i\) 行包括的兩個正整數分別表示 \(a_i,b_i\)(\(1 \leq a_i \leq b_i \leq 10^9\))。

輸出格式:

輸出一行,乙個整數,表示所有可能的派出划艇的方案數除以 \(1,000,000,007\) 得到的餘數。

輸入樣例#1:

21 2

2 3輸出樣例#1:

【樣例解釋】

在只有一所學校派出划艇的情況下有 \(4\) 種方案,兩所學校都派出划艇的情況下有 \(3\) 種方案,所以答案為 \(7\)。

【資料範圍】

子任務 \(1\)(\(9\) 分):\(1 \leq n \leq 500\) 且對於所有的 \(1 \leq i \leq n\),保證 \(a_i=b_i\)​。

子任務 \(2\)(\(22\) 分):\(1 \leq n \leq 500\) 且 \(\sum_^n (b_i-a_i) \leq 10^6\)。

子任務 \(3\)(\(27\) 分):\(1 \leq n \leq 100\)。

子任務 \(4\)(\(42\) 分):\(1 \leq n \leq 500\)。

題解:首先來考慮這樣乙個問題:如果有\(3\)個相同的區間,每個區間可以選數也可以不選,但是每個區間最多只能取出乙個數,區間內的數屬於\([1,len]\),要求取出其中的值嚴格遞增,方案數有多少種?

我們可以考慮用加法原理列舉一下每種情況:

乙個區間都不選:\(c_3^0*c_^0=1\)

只有乙個區間取數:\(c_3^1*c_^1=3*len\)

有兩個區間取數:\(c_3^2*c_^2=3*\frac\)

三個區間都取數:\(c_3^3*c_^3=1*\frac\)

加起來就是$$c_^ \times c_^ + c_^ \times c_^ + c_^ \times c_^ + c_^ \times c_$$因為$c_n^m=c_n^$,式子也可以表示成:$$c_ \times c_^ + c_^ \times c_^ + c_^ \times c_^ + c_^ \times c_^$$

考慮一下這個式子的實際意義:將乙個長度為\(len+3\)的區間劈成兩半,兩邊總共選出\(3\)個數,也就相當於:$$c_^3$$

我們把這個結論擴充套件一下:有\(n\)個相同的區間,區間內的數的範圍是\([1,len]\),每個區間可以選擇取或不取數,但是乙個區間最多只能取乙個數,方案數為$$c_^n$$

好的,那麼這個和我們的題目有什麼關係呢?

首先我們將划艇的數量離散,用\(tmp_i\)記錄排名為\(i\)的值,我們設區間\(i\)表示\([tmp_i,tmp_)\)那麼某個學校派出的划艇的數量一定是包含在乙個或多個區間內的.設\(f[i][j]\)表示當前處理到第\(i\)個學校,且第\(i\)個學校派出的划艇數量在\(j\)區間內的方案數.那麼如果某個學校派出的划艇數量與第\(i\)個學校派出的划艇數量沒有交集,那麼就可以直接加上這部分的方案數:$$len_j \times \sum_^\sum_^f[i'][j']$$

然後我們需要考慮列舉在\([0,i-1]\)中與學校\(i\)的派出人數有交集的學校,將交集這一部分的貢獻用組合的方法算出來.假設現在已經掃到了學校\(k(k\in[0,i-1])\),\(k\)與\(i\)有交集,且\(k\)學校必須派出划艇,那麼根據上面推出的結論,這一部分的貢獻為:$$\sum_^c_^ \times \sum_^\sum_^f[k][j]$$

然後,我們會發現直接這樣算是\(o(n^5)\)的,但是我們又會發現前面列舉\(f[i^][j^]\)可以直接字首和,那麼時間複雜度又降到了\(o(n^3)\).

再講一下初始化的問題,因為\(f[0][j]\)可以轉移到\(f[1][...]\),這些狀態都是合法的,所以\(f[0][j]=1\).\(f[i][0]\)同理.

這裡鏈乙個講的非常好的部落格

#includeusing namespace std;

const int n = 1000+5;

const int mod = 1e9+7;

int n, f[n][n*2], ans = 0, a[n], b[n], size = 0, tmp[n*2], cnt = 0, l[n], r[n], inv[n];

int main()

for(int i = 0; i < size; i++) f[0][i] = 1;

for(int i = 1; i <= n; i++)

}for(int j = 1; j < size; j++)

f[i][j] = ((long long)f[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1]+mod)%mod;

}cout << (f[n][size-1]-1+mod)%mod << endl;

return 0;

}

洛谷 P3629 APIO2010 巡邏

題目在這裡 這是乙個紫題,當然很難。我們往簡單的想,不建立新的道路時,從1號節點出發,把整棵樹上的每條邊遍歷至少一次,再回到1號節點,會恰好經過每條邊兩次,路線總長度為 2 n 1 根據樹的深度優先遍歷思想,很容易證明這個結論,因為每條邊必然被遞迴一次,回溯一次。建立1條新道路之後,因為新道路必須恰...

洛谷P5443 APIO2019 橋梁

apio場外選手沒事休閒做題。看了yyb的題解才把這題做出來 對操作進行分塊,把每 text 個操作分成1組,裡面大概有2類 沒被修改過的和被修改過的。接著對塊內詢問進行離線。對於沒有修改過的 我們可以直接排序然後把他們加入並查集。對於修改過的,我們看他的時間是否大於當前操作的時間,如果大於則加入原...

洛谷P3621 APIO2007 風鈴

你準備給弟弟 ike 買一件禮物,但是,ike 挑選禮物的方式很特別 他只喜歡那些能被他排成有序形狀的東西。你準備給 ike 買乙個風鈴。風鈴是一種多層的裝飾品,一般掛在天花板上。每個風鈴都包含一些由豎直線連起來的水平杆。每根杆的兩頭都有線連線,下面或者掛著另一根水平杆,或者掛著乙個玩具。下面是乙個...