bzoj3193 JLOI2013 地形生成

2022-05-02 03:42:05 字數 1388 閱讀 6852

最近ik正在做關於地形建模的工作。其中乙個工作階段就是把一些山排列成一行。每座山都有各不相同的標號和高度。為了遵從一些設計上的要求,每座山都設定了乙個關鍵數字,要求對於每座山,比它高且排列在它前面的其它山的數目必須少於它的關鍵數字。

顯然滿足要求的排列會有很多個。對於每乙個可能的排列,ik生成乙個對應的標號序列和等高線序列。標號序列就是按順序寫下每座山的標號。等高線序列就是按順序寫下它們的高度。例如有兩座山,這兩座山的乙個合法排列的第一座山的標號和高度為1和3,而第二座山的標號和高度分別為2和4,那麼這個排列的標號序列就是1 2,而等高線序列就是3 4.

現在問題就是,給出所有山的資訊,ik希望知道一共有多少種不同的符合條件的標號序列和等高線序列。

輸入第一行給出山的個數n。接下來n行每行有兩個整數,按照標號從1到n的順序分別給出一座山的高度和關鍵數。

輸出兩個用空格分隔開的數,第乙個數是不同的標號序列的個數,第二個數是不同的等高線序列的個數。這兩個答案都應該對2011取模,即輸出兩個答案除以2011取餘數的結果

21 2

2 22 2

對於所有的資料,有1<=n<=1000,所有的數字都是不大於109的正整數。

正解:組合數學+$dp$。

把所有山按照高度從大到小排序,相同的一段單獨處理。

對於第一問,算出每次可以插空的數量直接乘法原理即可。

第二問我們需要乙個$dp$,設$f[i][j]$表示放了第$i$座山,$i$在位置$j$的方案數。

那麼第$i+1$座山首先要滿足題目給的條件,然後還要在$i$的後面,於是列舉$i+1$的位置$k$,轉移即可。

這樣做複雜度是$o(n^)$的,我們在$dp$裡加上字首和優化就能做到$o(n^)$了。

1 #include 2

#define il inline

3#define rg register

4#define ll long long56

using

namespace

std;78

struct dataa[1005];9

10int f[1005][1005],sum[1005

],n,ans1,ans2;

1112 il int

gi()

1920 il int cmph(const data &a,const data &b)

2324 il void work(rg int l,rg int

r)31 rg int res=0;32

for (rg int i=1;i<=r;++i) (res+=f[r][i])%=2011

;33 (ans2*=res)%=2011; return;34

}3536int

main()

48 cout<'

'49 }

bzoj 3193 JLOI2013 地形生成

難忘多少個日子之前,我對著這道題死磕了將近1 4 4 3 h的情景 差不多有一整個學校日 上午 下午 晚自習 都是淚啊 include include include include include using namespace std define maxn 1005 const int inf...

BZOJ 3193 JLOI2013 地形生成

很難的一道題 首先第一問,如果沒有高度相同的,因為只有比他高的會產生影響,所以降序排序,然後從大往小往裡插入,那麼可插入的位置的個數就是min i,key 然後我們考慮有重複的,若不考慮之前已經插入過的相同高度的,方案數仍然是min i,key 那麼現在矛盾的就是,新插入的關鍵字和之前的關鍵字的關係...

BZOJ 2764 JLOI2011 基因補全

題目 題意 給定乙個長度為n的鹼基序列s和乙個長度為m的鹼基序列t,現在希望向序列t裡補一定的鹼基使得序列s和序列t配對,配對的規則是a與t配對,c與g配對,新增鹼基的位置與數量不同的方案視為不同,求不同的方案數。0n 2000 題解 可以考慮算出序列t在序列s裡匹配的本質不同方案數,利用dp可以很...