BZOJ 2306: [Ctsc2011]幸福路径】的更多相关文章

Description 有向图 G有n个顶点 1, 2, -, n,点i 的权值为 w(i).现在有一只蚂蚁,从 给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条 边,它的体力都会下降为原来的 ρ 倍,其中ρ 是一个给定的小于1的正常数.而 蚂蚁爬到某个顶点时的幸福度,是它当时的体力与该点权值的乘积. 我们把蚂蚁在爬行路径上幸福度的总和记为 H.很显然,对于不同的爬行路 径,H 的值也可能不同.小 Z 对 H 值的最大可能值很感兴趣,你能帮助他计算 吗?注意,蚂蚁爬…
2306: [Ctsc2011]幸福路径 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 912  Solved: 437 Description 有向图 G有n个顶点 1,  2, …,  n,点i 的权值为 w(i).现在有一只蚂蚁,从给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条边,它的体力都会下降为原来的 ρ 倍,其中ρ 是一个给定的小于1的正常数.而蚂蚁爬到某个顶点时的幸福度,是它当时的体力与该点权值的乘积…
Description 有向图 G有n个顶点 1, 2, -, n,点i 的权值为 w(i).现在有一只蚂蚁,从 给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条 边,它的体力都会下降为原来的 ρ 倍,其中ρ 是一个给定的小于1的正常数.而 蚂蚁爬到某个顶点时的幸福度,是它当时的体力与该点权值的乘积. 我们把蚂蚁在爬行路径上幸福度的总和记为 H.很显然,对于不同的爬行路 径,H 的值也可能不同.小 Z 对 H 值的最大可能值很感兴趣,你能帮助他计算 吗?注意,蚂蚁爬…
Description 有向图 G有n个顶点 1,  2, …,  n,点i 的权值为 w(i).现在有一只蚂蚁,从给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条边,它的体力都会下降为原来的 ρ 倍,其中ρ 是一个给定的小于1的正常数.而蚂蚁爬到某个顶点时的幸福度,是它当时的体力与该点权值的乘积. 我们把蚂蚁在爬行路径上幸福度的总和记为 H.很显然,对于不同的爬行路径,H 的值也可能不同.小 Z 对 H 值的最大可能值很感兴趣,你能帮助他计算吗?注意,蚂蚁爬行的路…
题目描述 有向图 G有n个顶点 1, 2, …, n,点i 的权值为 w(i).现在有一只蚂蚁,从 给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条 边,它的体力都会下降为原来的 ρ 倍,其中ρ 是一个给定的小于1的正常数.而 蚂蚁爬到某个顶点时的幸福度,是它当时的体力与该点权值的乘积. 我们把蚂蚁在爬行路径上幸福度的总和记为 H.很显然,对于不同的爬行路 径,H 的值也可能不同.小 Z 对 H 值的最大可能值很感兴趣,你能帮助他计算 吗?注意,蚂蚁爬行的路径长度可…
题目描述 一张n个点的有向图,每个点有一个权值.一开始从点$v_0$出发沿图中的边任意移动,移动到路径上的第$i$个点 输入 每一行中两个数之间用一个空格隔开. 输入文件第一行包含两个正整数 n,  m,分别表示 G 中顶点的个数和边的条数. 第二行包含 n个非负实数,依次表示 n个顶点权值 w(1), w(2), …, w(n). 第三行包含一个正整数 v0,表示给定的起点. 第四行包含一个实数 ρ,表示给定的小于 1的正常数. 接下来 m行,每行两个正整数 x, y,表示<x, y>是G的…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2306 题解 倍增 Floyd. 令 \(f[i][j][k]\) 表示走了 \(2^i\) 步,从 \(j\) 到 \(k\) 的距离最大值. 然后转移就是 \(f[i][j][k] = \max\limits_{l=1}^n f[i-1][j][l] + p \cdot f[i-1][l][k]\). 另外要每一个点建立一个长度为 \(0\) 的自环,用来统计总的最大值. #include…
这个有环的情况非常的讨厌,一开始想通过数学推等比数列的和,但是发现比较繁就不做了. 然后挖掘这题性质. 数据比较小,但是体力可以很接近1(恼怒),也就是说可能可以跳很多很多步.算了一下,大概跳了2e7次左右这个体力才缩到1e-14左右,这时已经几乎不会影响答案惹.也就是说,点比较少,有没有暴力做法? 发现从一个点假设满体力开始跳若干步,有最大价值的方案,如果前面一个点跳若干步过来,再在这个点以某个$x∈(0,1)$的体力开始,那么原来的最大的方案还是最大的,只要乘上一开始这个体力就好了.这说明答…
[BZOJ2306]幸福路径(动态规划,倍增) 题面 BZOJ 题解 不要求确切的值,只需要逼近 显然可以通过移动\(\infty\)步来达到逼近的效果 考虑每次的一步怎么移动 设\(f[i][j]\)表示走\(i\)步到了\(j\)能够得到的最大权值 \(f[i][v]=max(f[i-1][u])+W[v]*p^i,(u,v)\in G\) 这样的复杂度是\(O(T(n+m))\),\(T\)是自己设定的步数 但是这样子逼近精度很慢 假设\(p=0.999999\),大概要\(10^7\)步…
BZOJ 2337 XOR和路径 题解 这道题和游走那道题很像,但又不是完全相同. 因为异或,所以我们考虑拆位,分别考虑每一位: 设x[u]是从点u出发.到达点n时这一位异或和是1的概率. 对于所有这一位是1的边,若一个端点是u.另一个是v,则x[u] += (1 - x[v]) / deg[u],反之亦然: 对于这一位是0的边,x[u] += x[v] / deg[u],反之亦然. 然后得到好多方程,高斯消元即可. #include <cstdio> #include <cmath&g…
[「CTSC 2011」幸福路径 蚂蚁是可以无限走下去的,但是题目对于精度是有限定的,只要满足精度就行了. \({(1-1e-6)}^{2^{25}}=2.6e-15\) 考虑使用倍增的思想. 定义\(dp[x][y][t]\)为从\(x\)点出发,走\(2^t\)步,到达\(y\)所得到的最大权值. dp转移:\(dp[x][y][t]=max(dp[x][k][t-1]+p^{2^{t-1}} dp[k][y][t-1])\)(\(k \subset [1,n]\)). 一次转移复杂度为\(…
题解来源:http://www.cnblogs.com/jianglangcaijin/p/3799494.html 最后必然是走了一条链,或者是一个环(一直绕),或者是一条链加一个环.设f[i][j][k]表示从点j走了i步到达节点k的最大幸福度.那么f[i][j][j]就表示在绕环.那么在这个环上一直绕下去的期望为: 那么从S走i步到j再在j开始的环上绕圈的期望为: # include <cstdio> # include <cstring> # include <cst…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2306 给定一张有向图,每个点有权值,蚂蚁从某个节点出发,初始体力值为$1$,每走一条边$体力值*=p$,每经过一个点会获得幸福值为$点权*体力值$,求最大幸福值.即求 ${\sum _{i=0}^{\infty }w[i]*p^{i}}$且${U(i-1,i)=1}$其中${U(A,B)}$表示是否存在A到B这样一条路径. 正解是一个叫做倍增Floyed的东西. 其实就是说考虑到步数是可…
题目链接:BZOJ - 1907 题目分析 使用树形 DP,f[x][0] 表示以 x 为根的子树不能与 x 的父亲连接的最小路径数(即 x 是一个折线的拐点). f[x][1] 表示以 x 为根的子树可以与 x 的父亲连接的最小路径数. 转移的方式非常巧妙,Orz PoPoQQQ 的 blog . 代码 #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #…
BZOJ \(Description\) 给定一棵\(n\)个点的带权树,求树上\(\frac{n\times(n-1)}{2}\)条路径中,长度最大的\(m\)条路径的长度. \(n\leq50000,\ m\leq\min(3\times10^5,\frac{n\times(n-1)}{2})\). \(Solution\) 利用 点分治可以处理出树上所有路径 的性质,在每次点分治处理子树时,我们把当前根\(root\)和访问到的点\(x\)依次存到同一个数组里,把存下来的\(dis(x,r…
参考:https://www.cnblogs.com/CQzhangyu/p/7071477.html 神奇的点分治序(或者叫点剖?).就是把点分治扫过的点依次放进队列里,然后发现,对于每一棵树摊到序列上,每个点的值v是重心到这个点的距离,那么对序列上的每个点定义l为这个子树重心在序列上的位置,r为在这个重心下的当前扫的子树的前一棵被扫过的子树(天啊我在说什么),所以当前点的v+当前点的(l,r)中最大的v值就是以当前的重心为转折点接起来的两条路径,因为是r前一棵子树不会重复也不会出现计算两边同…
Description 问一棵树上前 \(k\) 大路径的边权. Sol 边分治. 非常感谢数据没有菊花图. 为了写写边分治试试然后就开了这道题. 边分治非常好想,选一条重边,分成两部分,然后分别求最大值,对每个重边建一个堆维护一下,全局堆里存答案. rebuild好像写的有问题啊qwq...疯狂RE不止...最后不管了,直接不重建树也能A... rebuild我就是想的将他建成二叉树的样子,每个点的度数不超过3或4差不多就可以了. Code /*************************…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2337 题意:给定一个带权无向图.从1号点走到n号点.每次从当前点随机(等概率)选择一条相邻边走下去.每条到达n的路径的值为走过的边权的抑或.求期望. 思路:将权值按照二进制位一位一位进行.设f[i]表示从i节点走到n节点的期望.i的度数为d[i].那么若一条边(i,j)的权值为0,则f[i]+=f[j]/d[i]:否则f[i]+=(1-f[j])/d[i]. #include <ios…
3784: 树上的路径 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 88  Solved: 27[Submit][Status][Discuss] Description 给定一个N个结点的树,结点用正整数1..N编号.每条边有一个正整数权值.用d(a,b)表示从结点a到结点b路边上经过边的权值.其中要求a<b.将这n*(n-1)/2个距离从大到小排序,输出前M个距离值.   Input 第一行两个正整数N,M 下面N-1行,每行三个正整数a,…
传送门 题意: 路径有$-1,1$两种权值,求有多少路径满足权值和为$0$且有一个点将路径分成权值和为$0$的两段 第四节课本来想去上化学,然后快上课了这道题还没调出来.....可恶我想上化学 昨天两节语文课潸然的李煜讲座也没去听呜呜听说今天的语文课还有什么文艺活动又错过了呜呜 还是有思路的 点分治,考虑经过$u$的路径 首先保证权值和为$0$,记录$c[i]$为当前权值和为$i$的路径有几条 怎么满足有一个点呢? $0+0=0$!!! 我们只要保证一段和$0$另一段自然也是$0$ 所以补充保存…
求点1到点n经过的路径权值异或和的期望. 考虑按位计算,对于每一位来说,令dp[i]表示从i到n的异或和期望值. 那么dp[i]=sum(dp[j]+1-dp[k]).如果w(i,j)这一位为0,如果w(i,k)这一位为1.边界为dp[n][n]=0. 那么求解每个方程组就得到了每一位的贡献.另外注意自环的出理就ok了. # include <cstdio> # include <cstring> # include <cstdlib> # include <io…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 思路很精妙.好像能应用到很多地方. 发现如果路径上有环,可以通过一些走法达到 异或了那个环 或 没有异或那个环. 所以路径上如果有环,可以把它们的异或值都存下来,之后随便挑选. 发现所有1~n的路径互相成环. 这样就能随便找一条路径,然后把所有环的异或值存下来,用高斯消元随便挑选. 消元的时候尽量保留高位,而且要上下消,这样保留下来的每一行的首位就不会被其他行的挑选情况影响. 注意挑…
题目链接 题意 给定一个 \(n(n\le 50000)\) 个点 \(m(m\le 100000)\) 条边的无向图,每条边上有一个权值.请你求一条从 \(1\)到\(n\)的路径,使得路径上的边的异或和最大. 题解 参考 https://blog.sengxian.com/algorithms/linear-basis 结论 答案=\(max_\{\)(某一条\(1\)到\(n\)的路径的异或和)\(\oplus\)(环\(i_1\)的异或和)\(\oplus\)(环\(i_2\)的异或和)…
一个点必然被路径覆盖,根据是否为路径的端点分类 \(f[x][0]\)表示以\(x\)为根的子树,\(x\)不为端点的最小路径覆盖数 \(f[x][1]\)表示以\(x\)为根的子树,\(x\)为一条路径端点的最小路径覆盖数 设当前做到了子树\(v\) \[ \begin{align*} f[x][0]&=\min\{f[x][0]+f[v][0],f[x][1]+f[v][1]\}\\ f[x][1]&=\min\{f[x][1]+f[v][0],cnt+f[v][1]\} \end{a…
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3697 [算法] 首先 , 将黑色的边变成1 ,白色的边变成-1 那么 , 问题就转化为了有多少条路径满足 : 1. 路径长度为0 2. 路径中间存在一个点使得这个点可以将这条路径分成两段且长度为0 考虑我们已经处理完了前面的子树 , 对于当前子树中一点x , 深度为d , 显然 , 前面的子树中要有一个深度为-d的点y ,这条路径合法当且仅当x到分治重心的路径上有一点满足d[z]…
点分治,设当前处理的块的重心为rt,预处理出每个子树中f[v][0/1]表示组合出.没组合出一对值v的链数(从当前儿子出发的链),能组合出一对v值就是可以有一个休息点 然后对于rt,经过rt且合法的路径是两边拼起来至少有一个休息点的路径,每次假如新儿子都和之前的儿子组合一遍即可,注意f[0][0]实际上也是有休息点的,因为组合出0就是休息点,另外加一下 #include<iostream> #include<cstdio> using namespace std; const in…
我是在在做网络流最小路径覆盖的时候找到这道题的 然后发现是个贪心+树形dp \( f[i] \)表示在\( i \)为根的子树中最少有几条链,\( v[i] \) 表示在\( i \)为根的子树中\( i \) 是( 0)否(1)为一条链的端点 然后贪心转移即可(有链端点则连起来) #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=10005; i…
很容易想出二分这个思路,但是要想办法去掉一个 $log$. 没错,空间换时间. 双指针的部分错了好几次~ Code: #include <set> #include <queue> #include <cstdio> #include <vector> #include <algorithm> #define N 2000003 #define ll long long #define setIO(s) freopen(s".in&qu…
好久不做点分治的题了,正好在联赛之前抓紧复习一下. 先把边权为 $0$ 的置为 $-1$.定义几个状态:$f[dis][0/1],g[dis][0/1]$ 其中 $f$ 代表在当前遍历的子树内的答案. 其中 $f[dis][0]$ 表示到根节点距离为 $dis$,没有遇到平衡点的个数,$f[dis][1]$ 表示遇到平衡点的个数. 然后就把 $f$ 和 $g$ 用乘法原理乘一下就可以了. 注意要及时清空. #include <cstdio> #include <vector> #i…
%%%%http://blog.csdn.net/popoqqq/article/details/43926365 #include<bits/stdc++.h> #define INF 0x7fffffff #define LL long long #define N 100005 using namespace std; inline int ra() { ,f=; char ch=getchar(); ; ch=getchar();} +ch-'; ch=getchar();} retu…