對於題目中的一句話:「對於同乙個島上的任意兩個生物,他們有且僅有乙個公共朋友,即對同一島上的任意兩個生物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的連通塊的個數 就等於...