樹dp+組合數
網上題解很多,這裡就放個有注釋的**
code
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 # define maxn 110view code8 # 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()
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 需要根據他自己主觀上的判斷確定...