bzoj1487 無歸島 樹形dp

2021-07-09 04:48:48 字數 915 閱讀 8898

對於題目中的一句話:「對於同乙個島上的任意兩個生物,他們有且僅有乙個公共朋友,即對同一島上的任意兩個生物a和b有且僅有乙個生物c既是a的朋友也是b的朋友。」,我個人以為他是說這乙個島上的點構成乙個環,否則我看不懂樣例中的圖是怎麼符合題意的。。。(果然我是語體教)那麼這句話是說有x個環,這x個環又構成乙個環。

這道題和bzoj1040騎士很像,不同的是這道題有多個環,而bzoj1040只有乙個環。那麼這道題目可以用類似於仙人掌圖的方法做。對於乙個環,求出最高點x的f[x][0]和f[x][1],其中f[x][0]表示x不選。設x兩邊的點y和z,那麼在求x的時候,首先x不選,那麼y和z隨意;如果x要選,那麼y和z都不選。這樣遞推一下就能得到f[x][0]和f[x][1]了。

ac**如下(**中now0表示fa[i]不選,到i為止對fa[i]的影響,反之亦然):

#include#include#include#define n 100005

#define inf 1000000000

using namespace std;

int n,m,tot,dfsclk,fst[n],pnt[n<<2],nxt[n<<2],f[n][2],fa[n],pos[n],a[n];

void add(int aa,int bb)

void solve(int x,int y)

f[x][0]+=now0; now0=0; now1=-inf;

for (i=y; i!=x; i=fa[i])

f[x][1]+=now1;

}void dfs(int x)

} f[x][1]=a[x];

for (p=fst[x]; p; p=nxt[p]){

int y=pnt[p];

if (fa[y]!=x && pos[x]

by lych

2015.12.27

BZOJ 1040 騎士(樹形DP)

題意 給出乙個圖,只有乙個環。每個點有乙個權值。選出一些點兩兩不相鄰,使得權值最大?思路 1 找到環。dfs,標記訪問,下乙個節點不是父節點但是已被訪問則這條邊就是環上的兩個點。標記這個邊是我們找到的環邊,並將這兩個點的中乙個設定為root,另乙個我們設為node 2 由於root和node不能同時...

BZOJ 1149 風鈴 樹形DP

題目描述的實際是一顆二叉樹,對於每個結點,要麼滿叉,要麼無叉。對於一種無解的簡單情況,我們搜一遍樹找到最淺的葉子結點1和最深的葉子結點2,如果dep 1 所以現在所有的葉子結點的深度要麼是dep 1 和dep 2 我們可以把所有結點用node x 標記狀態。node x 0表示x的子樹下所有葉子結點...

秘密襲擊 BZOJ5250 樹形DP

分析 聽說正解是fft 線段樹合併,然而我並不會.我們來思考其他的方法。我們要求的是連通塊第k大的和 對於某乙個連通塊,對答案的貢獻 val rank.k 我們不好直接算出每個連通塊的rank.k是多少 但我們可以列舉乙個limit for 1 w val rank.k lim的連通塊的個數 就等於...