51nod-1446-價值限制樹
真·一調一下午。
題意:給\(n\)個點,每個點有權值\(a_i\),若\(a_i=-1\)稱這個點\(not good\),否則是\(good\)的。形成任意一棵生成樹後若\(good\)的點相鄰的點有\(good\)點,則稱該點是\(great\)的。生成樹的價值是所有\(great\)的點的權值和。給定\(maxval\)值,求所有生成樹價值不超過\(maxval\)的生成樹個數。
題解:顯然需要建圖跑矩陣樹定理。可以發現乙個性質,就是在\(good\)的點中選出幾個點作為\(great\)點之後,形成的生成樹方案是一定的。所以設\(f[i]\)為選出了\(i\)個點作為\(great\)點的生成樹方案,發現\(f[i]\)並不能建圖後直接求。不妨設\(h[i]\)表示最多有\(i\)個點是\(great\)點的生成樹種類,則只需將\(great\)點相互連邊,不是\(good\)的點向其他點連邊,然後跑矩陣樹定理即可求\(h[i]\)。
由於\(h[i]\)的狀況是有i個點可以互相連通形成\(great\)點的生成樹方案數,實際上可能若這\(i\)個點中某個點成為葉子節點,且父節點是\(not good\)的節點,那麼會不滿\(i\)個,此時會有\(j\)個節點被選出,這樣的情況總和是\(\sum^_c_^f[j]\),於是由容斥定理:
\[f[i]=h[i]-\sum^_c_^f[j]
\]可以計算出\(f[i]\) 。
在每種\(f[i]\)的情況下,需要滿足價值不超過\(maxval\)的限制條件。也就是我們在所有\(good\)的點中選i個使其權值和不超過\(maxval\)。
設其種類數為\(g[i]\),則可以使用折半搜尋\((n≤40)\)計算出結果。折半搜尋的模版是:p4799世界冰球錦標賽
於是我們要求的總答案即為\(\sum_^f[i]g[i]\)
#include using namespace std;
#define ll long long
#define mod (ll)(1e9+7)
const int maxn=3e5+10;
int t,n,maxval,gd,ngd;
ll yuan[50],f[50],g[50],h[50];
ll gdb[50],bd[50];
bool good[50];
int qian[50][maxn],hou[50][maxn],cntq[50],cnth[50];//vector
void pre()
struct matrix
}du;
ll gauss()
}ans=(ans*du.ma[i][i]%mod+mod)%mod;
}n++;
return (ans+mod)%mod;
}void solh()
}for(int j=gd+1;j<=n;j++)
dfsq(qian1+1,hou1,(val+yuan[gdb[qian1]]),ge+1);
dfsq(qian1+1,hou1,val,ge);
}void dfsh(int qian1,int hou1,int val,int ge)
dfsh(qian1+1,hou1,(val+yuan[gdb[qian1]]),ge+1);
dfsh(qian1+1,hou1,val,ge);
}void solg()
else if(gd==0) return;
g[0]=0;
dfsq(1,mid,0,0);dfsh(mid+1,gd,0,0);
for(int i=1;i<=gd;i++)
for(int i=0;i<=gd;i++)}}
}int cm[50][50];
signed main()
}while(t--)
solh();
for(int i=0;i<=gd;i++)
solg();
ll ans=0;
for(int i=0;i<=gd;i++) ans=(ans+(ll)f[i]*g[i]%mod)%mod;
cout<}
return 0;
}
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點且與其相鄰的點中至少有...
51Nod1446 限制價值樹
講課時候一點兒都沒懂 分成兩個部分 找到所有滿足sum mx的集合,即列舉哪些是great的 統計每個great的集合對應多少個樹 發現,第二個部分只和great集合大小有關 具體的第乙個部分 折半爆搜 sort 雙指標,得到g i 大小為i的great集合個數 第二部分 f i 表示欽定i個是gr...
51Nod 1296 有限制的排列
acm模版 個人感覺,這個應該算是數字 dp。先通過處理輸入資料獲取乙個 state,表示每相鄰兩項之間的大小關係,state i 0,表示無特別關係,state i 1 表示第 i 項小於第 i 1 項,state i 2 表示第 i 項大於第 i 1 項。接著搞乙個 dp i j 表示由前 i ...