BZOJ 4013 HNOI2015 實驗比較

2022-05-11 03:14:21 字數 1578 閱讀 1051

樹dp+組合數

網上題解很多,這裡就放個有注釋的**

code

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 # define maxn 110

8 # define mod 1000000007

9using

namespace

std;

10 typedef long

long

ll;11

ll c[maxn][maxn];

12void

getc()20}

21}22int

n,m,n;

23struct

nodeg[10010

];26

intadj[maxn],e,ru[maxn];

27void add(int u,int

v);29 adj[u]=e++;30}

31int

fa[maxn];

32int find_fa(int

x)36

bool

vis[maxn];

37void

init()

48else51}

52for(int i=1;i<=n;i++)58}

59}60int

q[maxn],head,tail;

61bool

check()

68while(head

75if(cnt!=n)

76return1;

77}78ll f[maxn][maxn];

79//

f[i][j] 表示以i節點為根的子樹合成的序列中有j個小於號的方案數

80//

能出現小於號數的變化是因為兩個字數中的序列可以合併

81//

例如: 1<2 ; 3<4; 可以合併成 1=3<2=4

82ll p[maxn];

83int

size[maxn];

84void dfs(int

x)86 size[x]=0;87

bool ok=0;88

for(int i=adj[x];i!=-1;i=g[i].nxt)

95 size[x]+=size[v];

96continue;97

}98 memset(p,0,sizeof

(p));

99for(int j=1;j<=size[x];j++)

110}

111}

112 memcpy(f[x],p,sizeof

(f[x]));

113 size[x]+=size[v];

114}

115 size[x]++;

116if(x)

120}

121void

work()

127int

main()

view code

BZOJ4013 HNOI2015 實驗比較

先並查集合並 因為所有的xi互不相同,所以合併完後應該是乙個森林,如果出現環就無解。我們新建乙個根連向所有入度為0的點,就變成了一棵樹,考慮樹形dp。因為只要兩點不是其中一點是另一點的祖先的關係,他們就可以劃 因為大小關係不確定,所以將 連線的看做一塊,f i j 表示以 i 為根的子樹分成了j塊 ...

bzoj4013 HNOI2015 實驗比較

傳送門 思路 首先把等於的縮成乙個點,由好的向壞的連邊,有環肯定無解。然後題目裡說 小 d都最多隻記住了某一張質量不比 i差的另一張 ki 那就是每個點就最多只有一條入邊,那存在合法方案的圖就一定是森林。加乙個虛根,這可以樹形dp了。假設f i j 表示i號點的子樹中的所有點構成的有且只有j個小於號...

4013 HNOI2015 實驗比較

time limit 5 sec memory limit 512 mb submit 535 solved 268 submit status discuss 小d n 張,編號為1 到 n。實驗分若干輪進行,在每輪實驗中,小 d會被要求 某兩張隨機選取的,然後小d 需要根據他自己主觀上的判斷確定...