51Nod1446 限制價值樹

2022-02-04 20:11:04 字數 2564 閱讀 7754

講課時候一點兒都沒懂

分成兩個部分:

找到所有滿足sum<=mx的集合,即列舉哪些是great的、統計每個great的集合對應多少個樹

發現,第二個部分只和great集合大小有關

具體的第乙個部分:折半爆搜+sort+雙指標,得到g[i]大小為i的great集合個數

第二部分:

f[i]表示欽定i個是great的生成樹個數

答案=∑f[i]*g[i]

求f[i]?

不妨欽定1~i為great

完全圖,把所有連線至少乙個good的邊去掉,矩陣樹定理求生成樹

這樣得到了至多有i個great的個數h

減去孤立的:

則f[i]=h-∑0<=j即可。

#include#define reg register int

#define il inline

#define fi first

#define se second

#define mk(a,b) make_pair(a,b)

#define numb (ch^'0')

#define pb push_back

#define solid const auto &

#define enter cout<#define pii pairusing

namespace

std;

typedef

long

long

ll;template

il void rd(t &x)

template

il void output(t x)

template

il void ot(t x)

template

il void prt(t a,int st,int nd)

namespace

miracle

int mul(int x,int

y)int qm(int x,int

y)

return

ret;

}int

val[n];

int pre[(1

<<20)+233][21

];struct

po po(

int ss,int size)

bool friend operator

<(po a,po b)

}p[2

][m];

int cnt[2

];void dfs(int x,int lim,int lp,int sz,int

sum)

if(val[x]<0) dfs(x+1

,lim,lp,sz,sum);

else

}int

t[n][n];

int guass(int f[n][n],int

n)cout;

for(reg i=1;i<=n;++i)

}if(id==0) return0;

if(id!=i)

int inv=qm(f[i][i],mod-2

);

for(reg j=i+1;j<=n;++j)}}

}ll ret=ad(mod,tmp);

for(reg i=1;i<=n;++i) ret=mul(ret,f[i][i]);return

ret;

}int

g[n],f[n];

void

clear()

intmain()

}while(t--)

int half=n/2

; dfs(

1,half,0,0,0

); sort(p[

0]+1,p[0]+cnt[0]+1

);

for(reg i=1;i<=cnt[0];++i)

dfs(half+1,n,1,0,0

); sort(p[

1]+1,p[1]+cnt[1]+1

);

int ptr=cnt[0

];

for(reg i=1;i<=cnt[1];++i)

}for(reg i=0;i<=m;++i)

for(reg j=i+1;j<=m;++j)

for(reg j=m+1;j<=n;++j)

for(reg j=1;j<=n;++j)

}f[i]=guass(t,n-1

);

//cout<<" st "}

ll ans=0

;

//prt(g,0,m);

//prt(f,0,m);

for(reg i=0;i<=m;++i)

printf(

"%lld\n

",ans);

if(t) clear();

}}}signed main()

/*author: *miracle*

*/

51nod 1446 限制價值樹

有n個點 n 40 標記為0,1,2,n 1,每個點i有個價值val i 如果val i 1那麼這個點被定義為bad,否則如果val i 0那麼這個點為定義為good。現在給這n個點間連上n 1條邊,使它們構成乙個生成樹,定義樹中的點為great點當且僅當這個點本身是good點且與其相鄰的點中至少有...

51nod 1446 價值限制樹

51nod 1446 價值限制樹 真 一調一下午。題意 給 n 個點,每個點有權值 a i 若 a i 1 稱這個點 not good 否則是 good 的。形成任意一棵生成樹後若 good 的點相鄰的點有 good 點,則稱該點是 great 的。生成樹的價值是所有 great 的點的權值和。給定...

51Nod 1296 有限制的排列

acm模版 個人感覺,這個應該算是數字 dp。先通過處理輸入資料獲取乙個 state,表示每相鄰兩項之間的大小關係,state i 0,表示無特別關係,state i 1 表示第 i 項小於第 i 1 項,state i 2 表示第 i 項大於第 i 1 項。接著搞乙個 dp i j 表示由前 i ...