題目傳送門
給出乙個 \(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。也就是說每個節點到根...