NOIP2013模擬10 23囚人的旋律

2021-07-04 12:51:54 字數 995 閱讀 8631

題目大意

給定乙個逆序圖,表示若a[i]>a[j](i<j)那麼i向j連一條邊(這裡是給定邊數),問有多少個選點方案,是的選定的點之間沒有連邊,沒選定的點與選定的點中至少乙個點有連邊。

由於逆序圖能對應乙個序列,那麼我們將對應的圖轉成序列:(題目保證:存在至少乙個序列 ,按照題目描述中所述方法得到的逆序圖是給定的圖。)

直接處理出每個位置有多少個數a[i],在其後面又比它小(根據邊的關係)。

然後從左到右,每次選取1~n中沒選取的第a[i]小的數作為該位置的序列數。

我們來看一下選取的數的限制條件:

1、不能有邊相連,也就是必需為單調上公升序列

2、其他點必定與其中某個點相連:

若設相鄰兩個選定位置設為l、r,則不存在j∈(l,r)使得a[l]<a[j]<a[r](由於為單調序列,所以只考慮相鄰的就行了)

這樣我們可以通過dp來做:

設fi為選定第i個位置的合法方案數

然後n^2列舉,判斷轉移到的j是否合法,可以用線段樹logn,也可以記錄下比a[i]大的最小權值,直接比較就可以。

時間複雜度:n^2或(n^2)logn

(方便起見,將a[n+1]賦值成無窮大,將a[0]賦值成無窮小,從0開始做,強制前後必須取,最後輸出f[n+1]就行)

貼**

#include

#include

#include

#include

#define n 1002

#define mod 1000000007

using

namespace

std;

int n,m;

int a[n],b[n],f[n];

void init()

}void pre()

a[0]=0;

a[n+1]=n+1;

}void work()

}}void write()

int main()

模擬 NOIP 2013 花匠

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...

NOI(P)2013模擬 秘密任務

這題是在最短路上研究問題的,所以理所當然要建個圖先。其次我們先考慮費用,看看這圖,再yy一下,那麼我們可以發現這就是典型的最小割問題,可是我們還是要考慮如何判斷這個割是否唯一。首先,大家可以先去看我的另乙個blog,上面有寫類似這樣的判斷最大流是否唯一。其實這兩題是不同的。所以我在考試時就掛了。因為...

NOIP2013模擬 粉刷匠

給出n個球,其中有c1個球是顏色1的,有c2個球是顏色2的,有c3個球是顏色3的 有ck個球是顏色k的。求相鄰兩個球顏色不同的排列方案。k 15,ci 6,資料組數 2000 這種題一般很難有直接的通式,可以考慮dp。設fi,j表示,前i中顏色已經放完了,其中產生了j個不合法的空的方案數。這裡的空指...