BZOJ 3193 JLOI2013 地形生成

2022-05-11 03:10:17 字數 1421 閱讀 8935

很難的一道題

首先第一問,如果沒有高度相同的,因為只有比他高的會產生影響,所以降序排序,然後從大往小往裡插入,那麼可插入的位置的個數就是min(i,key),然後我們考慮有重複的,若不考慮之前已經插入過的相同高度的,方案數仍然是min(i,key),那麼現在矛盾的就是,新插入的關鍵字和之前的關鍵字的關係不知道,也就是說,不知道這個新的點,和之前相同高度的點的位置關係;可以按關鍵字公升序排序,那麼顯然,如果兩個高度相同的山挨著,那麼後插入的一定能放在之前插入的後面,那麼新增的位置就是之前的相同高度的個數(可能會覺得沒考慮放在插入在相同高度的前面的情況,其實這種情況已經被直接放在不同高度的點後面包含了)

然後第二問,是乙個之前沒有做過的分段dp;

高度相同度互換位置是沒有貢獻的,可以把關鍵之大的強制放在小的後面,這樣也能保證合法性;然後f[i][j]就是表示,放到第i個高度相同的點,位置在j,然後之前的點都在j之前方案數,那麼顯然f[i][j]+=f[i-1][k](1<=k<=g[i].key),那麼在最後取答案的時候,就是取

f[r][min(l,max(g[i].key))]; (s為相同高度區間的右端點,l是做端點)

code

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 # define mod 2011

8using

namespace

std;

9 typedef long

long

ll;10

ll ans1,ans2;

11int

n;12

struct

mtg[1010

];15

bool cmp(const mt a,const

mt b)

19void

init()

29cout<

*/31}32

void

work1()

39else

42 ans1=ans1*(min(g[i].key,l)+ji)%mod;

43//

cout<

}45 cout

46}47 ll f[1010][1010

];48

void

work2()

60else

63if

(flag)68}

69/*

70if(i==7)

73*/

74for(int j=1;j<=1000;j++)

77//

cout<

if(g[i].h!=g[i+1

].h)85}

86 cout

88int

main()

view code

bzoj 3193 JLOI2013 地形生成

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

bzoj3193 JLOI2013 地形生成

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

BZOJ 2764 JLOI2011 基因補全

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