「THUWC 2017」随机二分图

解题思路 :

首先有一个 \(40pts\) 的做法:

前 \(20pts\) 暴力枚举最终的匹配是怎样的,check一下计算方案数,后 \(20pts\) 令 \(f[s][i]\) 表示当前左边的点匹配到前 \(i\) 个,右边的点匹配状况是 \(s\) 时继续往下匹配方案数的期望,枚举与 \(i\) 相连的边转移即可。

对于剩下的 \(t=1,t=2\) 的情况,先和 \(t = 0\) 一样直接连 \((a1,b1), (a2,b2)\)。然后观察此时概率发生的偏差。

以 \(t=1\) 为例,只选 \((a1,b1)\) 或者只选 \((a2, b2)\) 时概率和正确情况一样都是 \(\frac{1}{2}\) 。但是如果两条边都选此时算的概率是 \(\frac{1}{4}\) ,而应该是 \(\frac{1}{2}\) ,所以还要补连一种转移同时选上四个点概率是 \(\frac{1}{4}\) ,根据期望的线性性,正确性显然。

对于 \(t=2\) 情况,和上面一样分析,发现对于同时选的情况多算了 \(\frac{1}{4}\) ,补连一条概率是 \(-\frac{1}{4}\) 的转移即可。

此时我们就不能按照 \(40pts\) 的方法DP了,需要设 \(f[s1][s2]\) 表示此时左边点匹配状况是 \(s1\),右边匹配状况是 \(s2\) ,继续向下匹配方案数的期望。但是为了不重,我们每次还是要为 \(s1\) 中编号最小为匹配的点安排匹配,那么这样状态数就是和 \(40pts\) 的转移同阶的,用一个map记忆化一下复杂度就是 \(O(n^22^n)\) 。

code

/*program by mangoyang*/
#pragma GCC optimize("Ofast", "inline")
#include<bits/stdc++.h>
#define inf ((int)(1e9))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int f = 0, ch = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int INV2 = 500000004, INV4 = 250000002, mod = 1e9 + 7;
map<int, int> f;
int a[300], b[300], n, m, cnt; inline int Pow(int a, int b){
int ans = 1;
for(; b; b >>= 1, a = 1ll * a * a % mod)
if(b & 1) ans = 1ll * ans * a % mod;
return ans;
} inline int dfs(int mask){
if(mask == (1 << (n << 1)) - 1) return 1;
if(f.count(mask)) return f[mask];
int now = 0, tmp = 0;
for(int i = n - 1; ~i; i--)
if(!((1 << i) & mask)) now = (1 << i);
for(int i = 1; i <= cnt; i++)
if((now & a[i]) && !(mask & a[i]))
(tmp += 1ll * dfs(mask | a[i]) * b[i] % mod) %= mod;
return f[mask] = tmp;
} int main(){
read(n), read(m);
for(int i = 1, op, x, y; i <= m; i++){
read(op), read(x), read(y), x--, y--;
int tmp = (1 << x) | (1 << y + n);
a[++cnt] = tmp, b[cnt] = INV2;
if(op){
read(x), read(y), x--, y--;
a[++cnt] = (1 << x) | (1 << y + n), b[cnt] = INV2;
if(tmp & ((1 << x) | (1 << y + n))) continue;
tmp |= (1 << x) | (1 << y + n);
a[++cnt] = tmp, b[cnt] = op == 1 ? INV4 : -INV4 + mod;
}
}
cout << 1ll * dfs(0) * Pow(2, n) % mod << endl;
return 0;
}

「THUWC 2017」随机二分图的更多相关文章

  1. @loj - 2290@ 「THUWC 2017」随机二分图

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个左右各 n 个点的二分图,图中的边会按照一定的规律随机出现. ...

  2. 【LOJ】#2290. 「THUWC 2017」随机二分图

    题解 看了一眼觉得是求出图对图统计完美匹配的个数(可能之前做过这样模拟题弃疗了,一直心怀恐惧... 然后说是统计一下每种匹配出现的概率,也就是,当前左边点匹配状态为S,右边点匹配状态为T,每种匹配出现 ...

  3. LOJ 2288「THUWC 2017」大葱的神力

    LOJ 2288「THUWC 2017」大葱的神力 Link Solution 比较水的提交答案题了吧 第一个点爆搜 第二个点爆搜+剪枝,我的剪枝就是先算出 \(mx[i]\) 表示选取第 \(i \ ...

  4. 「LOJ 2289」「THUWC 2017」在美妙的数学王国中畅游——LCT&泰勒展开

    题目大意: 传送门 给一个动态树,每个节点上维护一个函数为$f(x)=sin(ax+b)$.$f(x)=e^{ax+b}$.$f(x)=ax+b$中的一个. 支持删边连边,修改节点上函数的操作. 每次 ...

  5. 「THUWC 2017」在美妙的数学王国中畅游

    这个题目很明显在暗示你要用泰勒展开. 直接套上去泰勒展开的式子,精度的话保留12项左右即可. 分别维护每一项的和,可能比较难写吧. 然后强行套一个LCT就没了.

  6. 【LOJ】#2289. 「THUWC 2017」在美妙的数学王国中畅游

    题解 我们发现,题目告诉我们这个东西就是一个lct 首先,如果只有3,问题就非常简单了,我们算出所有a的总和,所有b的总和就好了 要是1和2也是多项式就好了--其实可以!也就是下面泰勒展开的用处,我们 ...

  7. @loj - 2289@「THUWC 2017」在美妙的数学王国中畅游

    目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个点编号 0 到 n-1,每个点有一个从 [0,1] 映射到 ...

  8. @loj - 2288@「THUWC 2017」大葱的神力

    目录 @description@ @solution@ @data - 1@ @data - 2@ @data - 3@ @data - 4@ @data - 5@ @data - 6@ @data ...

  9. LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)

    写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...

随机推荐

  1. IO流-文件的写入和读取

    1.文件写入 类: FileWriter继承自Writer(字符流基类之一,另外一个为Reader) 方法: writer(参数); 根据参数可以写入字符.字符数组.字符数组中的一部分.整型.字符串. ...

  2. 【BZOJ】4756: [Usaco2017 Jan]Promotion Counting

    [题意]带点权树,统计每个结点子树内点权比它大的结点数. [算法]线段树合并 [题解]对每个点建权值线段树(动态开点),DFS中将自身和儿子线段树合并后统计. 注意三个量tot,cnt,tots,细心 ...

  3. python学习笔记(十三)之lambda表达式

    lambda表达式: 用法 lambda x : 2 * x + 1 其中:前面是参数,后面是返回值. >>> def ds(x): ... return 2 * x + 1 ... ...

  4. NYOJ 202 红黑树 (二叉树)

    题目链接 描述 什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子是红色的树... 当然,这个是我说的... <算法导论>上可不是这么说的: 如果一个二叉查找树满足下面的红黑 ...

  5. three.js_sence(场景)

    1,THREE.Scene 的作用 (1)THREE.Scene 对象是所有不同对象的容器,也就是说该对象保存所有物体.光源.摄像机以及渲染所需的其他对象. (2)THREE.Scene 对象又是被称 ...

  6. localStorage H5本地存储

    域内安全.永久保存.即客户端或浏览器中来自同一域名的所有页面都可访问localStorage数据且数据除了删除否则永久保存,但客户端或浏览器之间的数据相互独立. <!doctype html&g ...

  7. Term Term ssh登陆linux后 显示乱码

    setup----terminal----locale----“chinese” OK!!!!!

  8. Machine Learning系列--TF-IDF模型的概率解释

    信息检索概述 信息检索是当前应用十分广泛的一种技术,论文检索.搜索引擎都属于信息检索的范畴.通常,人们把信息检索问题抽象为:在文档集合D上,对于由关键词w[1] ... w[k]组成的查询串q,返回一 ...

  9. Java Web 远程调试

    Java Web 远程 调试 Tomcat 下载压缩版服务器 环境:Tomcat.Eclipse,做远程调试我们并不需要其他特殊插件 1.配置Tomcat/bin/startup.bat 在前面增加代 ...

  10. [ python ] 线程的操作

    目录 (见右侧目录栏导航) - 1. 前言    - 1.1 进程    - 1.2 有了进程为什么要有线程    - 1.3 线程的出现    - 1.4 进程和线程的关系    - 1.5 线程的 ...