大型补档计划

题目链接

如果整体来做,发现既有加法,也有整体异或,这样不容易搞。

考虑异或,各个位置互不干扰,按位考虑一下。

枚举每一位 \(k\)

发现如果设 \(f[u]\) 为这一位的期望结果还是不好做。

由于 每个位置只有 0 或者 1 两种操作,不妨设 \(f[u]\) 为 \(u - n\) 这一位路径为 1 的概率,最后对答案的贡献是 \(2 ^ k * f[1]\)。

然后一个按照题意的转移:\(f[u] = \frac{1}{deg[u]}(\sum_{w = 0}f[v] + \sum_{w = 1}(1 - f[v]))\),这是一个只涉及加减运算的方程组,就能高斯消元了。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 105, M = 10005;
int n, m, d[N];
int head[N], numE = 0;
double a[N][N];
struct E{
int next, v, w;
} e[M << 1];
void add(int u, int v, int w) {
e[++numE] = (E) { head[u], v, w };
head[u] = numE; d[u]++;
} void gauss() {
int r, c;
for (r = 1, c = 1; c < n; c++) {
int t = -1;
for (int i = r; i < n; i++)
if (fabs(a[i][c]) && (t == -1 || fabs(a[i][c]) > fabs(a[t][c]))) t = i;
for (int i = c; i <= n; i++) swap(a[r][c], a[t][c]);
for (int i = n; i >= c; i--) a[r][i] /= a[r][c];
for (int i = 1; i < n; i++) {
if (i != r) for (int j = n; j >= c; j--) a[i][j] -= a[r][j] * a[i][c];
}
r++;
}
} int main() {
scanf("%d%d", &n, &m);
for (int i = 1, u, v, w; i <= m; i++) {
scanf("%d%d%d", &u, &v, &w);
add(u, v, w); if(u != v) add(v, u, w);
}
double ans = 0;
for (int i = 30; ~i; i--) {
memset(a, 0, sizeof a);
for (int u = 1; u < n; u++) {
a[u][u] = d[u];
for (int j = head[u]; j; j = e[j].next) {
int v = e[j].v;
if (e[j].w >> i & 1) {
a[u][n]++;
if (v != n) a[u][v]++;
} else {
if (v != n) a[u][v]--;
}
}
}
gauss();
ans += (1 << i) * a[1][n];
}
printf("%.3lf\n", ans);
return 0;
}

AcWing 326. XOR和路径的更多相关文章

  1. 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

    2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Stat ...

  2. BZOJ2337: [HNOI2011]XOR和路径

    题解: 异或操作是每一位独立的,所以我们可以考虑每一位分开做. 假设当前正在处理第k位 那令f[i]表示从i到n 为1的概率.因为不是有向无环图(绿豆蛙的归宿),所以我们要用到高斯消元. 若有边i-& ...

  3. BZOJ 2337: [HNOI2011]XOR和路径( 高斯消元 )

    一位一位考虑异或结果, f(x)表示x->n异或值为1的概率, 列出式子然后高斯消元就行了 --------------------------------------------------- ...

  4. BZOJ 2337: [HNOI2011]XOR和路径 [高斯消元 概率DP]

    2337: [HNOI2011]XOR和路径 题意:一个边权无向连通图,每次等概率走向相连的点,求1到n的边权期望异或和 这道题和之前做过的高斯消元解方程组DP的题目不一样的是要求期望异或和,期望之间 ...

  5. 【BZOJ2337】Xor和路径(高斯消元)

    [BZOJ2337]Xor和路径(高斯消元) 题面 BZOJ 题解 我应该多学点套路: 对于xor之类的位运算,要想到每一位拆开算贡献 所以,对于每一位拆开来看 好了,既然是按位来算 我们就只需要计算 ...

  6. [HNOI2011]XOR和路径 && [HNOI2013]游走

    [HNOI2011]XOR和路径 题目大意 具体题目:戳我 题目: 给定一个n个点,m条边的有重边.有自环的无向图,其中每个边都有一个边权. 现在随机选择一条1到n的路径,路径权值为这条路径上所有边权 ...

  7. 洛谷 P4151 [WC2011]最大XOR和路径 解题报告

    P4151 [WC2011]最大XOR和路径 题意 求无向带权图的最大异或路径 范围 思路还是很厉害的,上午想了好一会儿都不知道怎么做 先随便求出一颗生成树,然后每条返祖边都可以出现一个环,从的路径上 ...

  8. [WC2011]最大XOR和路径 线性基

    [WC2011]最大XOR和路径 LG传送门 需要充分发掘经过路径的性质:首先注意不一定是简单路径,但由于统计的是异或值,重复走是不会被统计到的,考虑对于任意一条从\(1\)到\(n\)的路径的有效部 ...

  9. P4151 [WC2011]最大XOR和路径

    P4151 [WC2011]最大XOR和路径 一道妙极了的题. 首先直接从1走到n 然后现在图上有很多环 所以可以在走到n之后走到环上一个点,再走一遍环,再原路返回.这样就会xor上环的权值. 然后只 ...

随机推荐

  1. MySQL索引结构之B+树索引(面)

    首先要明白索引(index)是在存储引擎(storage engine)层面实现的,而不是server层面.不是所有的存储引擎都支持所有的索引类型.即使多个存储引擎支持某一索引类型,它们的实现和行为也 ...

  2. 模拟鼠标操作(ActionChains)(转 侵删)

    在日常的测试中,经常会遇到需要鼠标去操作的一些事情,比如说悬浮菜单.拖动验证码等,这一节我们来学习如何使用webdriver模拟鼠标的操作 首页模拟鼠标的操作要首先引入ActionChains的包 f ...

  3. Linux上传递文件到另外一个Linux服务器

    现在的项目由于安全的需要,测试服务器被设置不能直接连接,想要连接的话,只能先登录一个服务器,然后以这个服务器为跳板,去登录另外一台真正的 服务器,即使是测试环境也只能这样操作.只能是相对来说安全一些. ...

  4. thinkPHP命令执行漏洞

    thinkPHP中反斜杠的作用是类库\命名空间 命令执行的姿势 通过反射invokefunction调用call_user_func_array方法,call_user_func_array函数接受两 ...

  5. invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"

    解决办法: $ sudo nginx -c /usr/local/etc/nginx/nginx.conf $ sudo nginx -s reload

  6. 轻松学编曲,论FL钢琴卷帘

    我们平时做视频时难免要用到音乐,市面上又有很多调音编曲软件,我们该如何选择呢?在这里笔者给大家推荐一款音乐制作软件FL Studio20,也就是业内知名度很高的水果音乐制作软件,这款音乐制作软件笔者用 ...

  7. 如何使用ABBYY FineReader 用户词典识别专业术语?

    ABBYY FineReader 15可以说是比较新的版本,在这个版本中能运用强大的光学字符识别技术对PDF文档扫描件.图像等文件进行OCR识别.在识别的过程中,会使用其内置的词典检查识别文字,以获得 ...

  8. laravel 返回SQL

    默认情况下,toSql 获取到的 sql 里面的参数使用 "?" 代替的,如下: 1 DB::table('user')->where('id', 1)->toSql( ...

  9. C++基础知识篇:C++ 变量作用域

    作用域是程序的一个区域,一般来说有三个地方可以定义变量: 在函数或一个代码块内部声明的变量,称为局部变量. 在函数参数的定义中声明的变量,称为形式参数. 在所有函数外部声明的变量,称为全局变量. 我们 ...

  10. 放进你的收藏夹吃灰!Linux 运维必备的 40 个命令总结

    1.删除0字节文件 find -type f -size 0 -exec rm -rf {} ; 2.查看进程 按内存从大到小排列 PS -e -o "%C : %p : %z : %a&q ...