題解 HNOI AHOI2018 毒瘤

2022-05-01 19:33:08 字數 2156 閱讀 5251

題目傳送門

給出乙個 \(n\) 個點 \(m\) 條邊的無向圖,問有多少個點集滿足點集中任意兩點均不存在邊相連。

\(n\le 10^5,m-n\le 10\),答案對 \(998244353\) 取模。

妙啊!!!

首先我們從樹的形態開始考慮,你發現答案其實就是獨立集的個數,具體來說我們可以設 \(f_\) 表示 \(u\) 點選或不選的方案數,可以得到:

\[f_=\prod_ (f_+f_)

\]\[f_=\prod_ f_

\]然後我們考慮有返祖邊的情況,你發現這個邊數特別少,於是我們考慮列舉每一條邊的情況,你發現只有 \(3\) 種,即 \((0,0),(0,1),(1,0)\),但是實際上可以壓縮到 \(2\) 種情況,即考慮乙個點是 \(0\) 還是 \(1\)。於是我們可以列舉一下情況,然後時間複雜度就是 \(\theta(2^ n)\)。就可以獲得 \(75\) 的好成績了。為了方便,我們之後稱需要列舉情況的點為「不定點」。

然後你發現實際上每次 dp,我們重複計算的東西實際上很多,但是我們經過思考發現其實每次只會改變「不定點」的虛樹上的點。於是,我們只需要考慮虛樹上兒子對父親產生的貢獻即可。

然後我們發現實際上虛樹上的兒子對父親實際上可以表示為 \(k_f_+k_f_\),於是我們可以預處理出 \(k_\) 這個係數,至於不在虛樹上的兒子產生的貢獻可以預處理出來。這個式子裡面的常數是實際上就是不會改變的點對「不定點」產生的貢獻造成的。

然後你就發現這個東西其實跟動態 dp 的思想是差不對的,所以這道題實際上也可以用動態 dp 搞過去。

時間複雜度 \(\theta(n+s2^s)\),其中 \(s=m-n+1\)。

#include using namespace std;

#define int register int

#define mod 998244353

#define maxn 100005

template inline void read (t &t)while (c >= '0' && c <= '9') t *= f;}

template void read (t &x,args& ... args)

template inline void write (t x)if (x > 9) write (x / 10);putchar (x % 10 + '0');}

int n,m;

int mul (int a,int b)

int dec (int a,int b)

int add (int a,int b)

struct coe;}

coe operator + (const coe &p)const;}

}k[maxn][2];

struct node;

vector g[maxn];

vector e[maxn];

void add_edge (int u,int v)

void add_edge1 (int u,int v,coe w1,coe w2));

}int ind,cnt,eu[maxn],ev[maxn],siz[maxn],dfn[maxn],mark[maxn];

void dfs (int u,int fa)

} mark[u] |= siz[u] >= 2,siz[u] = siz[u] || mark[u];

}int f[maxn][2],p[maxn][2],sur[maxn][2],vis[maxn];

int dfs1 (int u)

else if (mark[u]) add_edge1 (u,w,k[v][0] + k[v][1],k[v][0]);

else k[u][0] = k[v][0] + k[v][1],k[u][1] = k[v][0],pos = w;

} if (mark[u]) k[u][0] = coe ,k[u][1] = coe ,pos = u;

else k[u][0] = k[u][0] * p[u][0],k[u][1] = k[u][1] * p[u][1];

return pos;

}void dfs2 (int u)

}signed main()

write (ans),putchar ('\n');

return 0;

}

HNOI AHOI2018 轉盤 題解

題目鏈結 好難的題。首先,有等待操作不太好弄。可以發現 在總時間一定的情況下,到每個點越晚越好。所以,可以把所有等待都移到起點處,解不會變差。由於是環,破環為鏈處理。如果在 s 時間在 i 1 i n 出發,那麼到 j i j的時間為 s j i 根據要求,得 s j i t j 即 s max t...

HNOI AHOI2018 尋寶遊戲

hnoi ahoi2018 尋寶遊戲 思維好題。將每一位領出來,組成 m 個長度為 n 的二進位制數。考慮將操作轉化為 01 序列,lor to0,land to1 觀察之後發現要使得第 j 位運算結果是 1 則最後乙個 lor1 操作的位置一定要在 land0 後面。轉化一下就是就要求 x gt ...

洛谷 HNOI AHOI2018 道路

初見安 這裡是傳送門 洛谷p4438 道路 題目乍一看很複雜,其實挺簡單的 就是一棵有根的滿二叉樹,要從每個葉子節點出發到根節點,每條路有個性質,公路or鐵路,現在要選n 1條道路翻新,滿足題目所述的條件。看n的範圍明顯是不能暴力列舉的。但是我們可以抓住一點 樹的深度不超過40。也就是說每個節點到根...