【HNOI2018】毒瘤】的更多相关文章

[BZOJ5287][HNOI2018]毒瘤(动态规划,容斥) 题面 BZOJ 洛谷 题解 考场上想到的暴力做法是容斥: 因为\(m-n\le 10\),所以最多会多出来\(11\)条非树边. 如果就是一棵树的话,显然答案就是独立集的个数. 非树边\(2^{11}\)枚举,强制非树边的两端同时备选导致不合法,容斥计算答案即可. 这样子的复杂度是\(O(2^{11}n)\),估算出来是\(2s\),然而在\(HNOI\)考场跑要\(20s\)(大雾 考虑如何优化这个东西. 我们\(2^{11}\)…
题目描述 从前有一名毒瘤. 毒瘤最近发现了量产毒瘤题的奥秘.考虑如下类型的数据结构题:给出一个数组,要求支持若干种奇奇怪怪的修改操作(比如区间加一个数,或者区间开平方),并支持询问区间和.毒瘤考虑了n个这样的修改操作,并编号为\(1\sim n\).当毒瘤要出数据结构题的时候,他就将这些修改操作中选若干个出来,然后出成一道题. 当然了,这样出的题有可能不可做.通过精妙的数学推理,毒瘤揭露了这些修改操作的关系:有m对"互相排斥"的修改操作,第i对是第ui个操作和第vi个操作.当一道题同时…
Description 从前有一名毒瘤. 毒瘤最近发现了量产毒瘤题的奥秘.考虑如下类型的数据结构题:给出一个数组,要求支持若干种奇奇怪怪的修改操作(比如区间加一个数,或者区间开平方),并支持询问区间和.毒瘤考虑了\(n\)个这样的修改操作,并编号为\(1\sim n\).当毒瘤要出数据结构题的时候,他就将这些修改操作中选若干个出来,然后出成一道题. 当然了,这样出的题有可能不可做.通过精妙的数学推理,毒瘤揭露了这些修改操作的关系:有\(m\)对"互相排斥"的修改操作,第\(i\)对是第…
Description Solution \(dfs\) 出一棵生成树之后,多出来的边就都是反祖边了 把反祖边两个端点都拿出来,就会得到最多 \(k=2*(m-n+1)\) 个关键点 除了关键点以外的点转移都是一样的,我们可以预处理出来 关键点数量不多,我们 \(2^k\) 枚举状态,然后像树形 \(DP\) 一样转移就行了 转移需要构一棵虚树,对于虚树上的一条边,对应在原树上的一条链转移也是一样的 如果知道了虚树上 \(x\) 的 \(DP\) 值,\(f[x][0],f[x][1]\),那么…
BZOJ LOJ 洛谷 设\(f[i][0/1]\)表示到第\(i\)个点,不选/选这个点的方案数.对于一棵树,有:\[f[x][0]=\prod_{v\in son[x]}(f[v][0]+f[v][1])\\f[x][1]=\prod_{v\in son[x]}f[v][0]\] 对于非树边的限制,可以再加一维非树边端点的状态(选没选),能得\(55\)分. 对于一条非树边\((u,v)\),要么是\(u\)选\(v\)不选,要么是\(u\)不选\(v\)选,要么是\(u\)不选\(v\)不…
显然的做法是暴力枚举非树边所连接两点的选或不选,大力dp.考场上写的是最暴力的O(3n-mn),成功比大众分少10分.容斥或者注意到某些枚举是不必要的就能让底数变成2.但暴力的极限也就到此为止. 每次重新dp做了大量重复的事,考虑从减少重复计算方面优化.先跑一遍没有限制的树形dp.将非树边所连接的点拎出来建一棵虚树.注意到虚树中某点对其父亲的贡献系数(也即由该点到其父亲的链上点的dp值与其关系)是不变的,那么dp出系数,依旧暴力枚举非树边就可以了.一定程度上与noip2018d2t3有相似之处?…
题面链接 luogu sol 这篇博是骗访问量的QwQ. 考虑树怎么做,简单容斥.诸如\(f[u][0]=\prod (f[v][0]+f[v][1]),f[u][1]=\prod f[v][0]\) 考虑\(80\)分怎么做(其实只有\(75\)分),暴力枚举多出来的边链接情况,然后\(dp\),复杂度\(O(2^{m-n+1}n)\). 考虑\(100\)分怎么做,发现只有\(22\)个有用的点,于是建虚树,预处理转移系数,有点复杂.复杂度\(O((m-n+1)*2^{m-n+1}+n)\)…
暴力枚举非树边取值做DP可得75. 注意到每次枚举出一个容斥状态的时候,都要做大量重复操作. 建立虚树,预处理出虚树上两点间的转移系数.也可动态DP解决. 树上倍增.动态DP.虚树DP似乎是这种问题的三种通用解法. 代码不是特别长但极其难写,预处理过程中要考虑各种情况.水平不够只好抄代码. #include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) #define F…
虚树+dp 直接看zlttttt的强大题解 zlttttt的题解看这里 #include<bits/stdc++.h> #define ui unsigned int #define ll long long #define db double #define ld long double #define ull unsigned long long const int MAXN=100000+10,MAXM=100010+10,Mod=998244353; int n,m,e,to[MAXM…
自己 yy 了一个动态 dp 做法,应该是全网唯一用 LCT 写的. code: #include <bits/stdc++.h> #define ll long long #define lson tr[x].ch[0] #define rson tr[x].ch[1] #define setIO(s) freopen(s".in","r",stdin) using namespace std; const int N=200005; const ll…