很難的一道題
首先第一問,如果沒有高度相同的,因為只有比他高的會產生影響,所以降序排序,然後從大往小往裡插入,那麼可插入的位置的個數就是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 2011view code8using
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()
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可以很...